文章列表
 
您正在查看 "c/c++" 分类下的文章

2008年03月05日 星期三 20:39
今天用C实现了vector, 最初想用realloc()函数来扩充内存, 后来一想, 用realloc()函数会存在一个问题: 如果在后面没有连续的内存, 那么系统将会在另一个地方申请一块内存, 然后把现在的内存数据搬过去. 如此, 假如对一个很大内存块进行realloc, 发生这种"搬运"现象, 效率比较低.

于是我在vector内部用了一个链表, 当vector现有的长度不够时, 就再申请一段内存, 添加到链表中.

我把vector也添加到libponyse中了, 即pvector.c和pvector.h文件, 大家可以下载查看源程序.
 
2007年10月15日 星期一 10:27
最近学习ACE, 无意中看到一篇文章实现singleton模式, 发现一个奇怪的问题, 以下在源代码(为了方便, 我加了一些"调试"用的输出):

#include <iostream>

using namespace std;

class my_singleton
{
public:
    static my_singleton *instance();
    void show_my_life();
protected:
    my_singleton();
    ~my_singleton();
private:
    static my_singleton *m_instance;
};

my_singleton *my_singleton::m_instance = NULL;

my_singleton *my_singleton::instance()
{
    if (m_instance == NULL)
    {
        m_instance = new my_singleton;
    }
    else
    {
        cout << "instance is already created." << endl;
    }
    return m_instance;
}

my_singleton::my_singleton()
{
    cout << "instance creating..." << endl;
}

void my_singleton::show_my_life()
{
    cout << "i'm living at " << (void*)this << endl;
}

/* 析构函数 */
my_singleton::~my_singleton()
{
    cout << "call deconstruction function." << endl;
    if (m_instance != NULL)
    {
    delete m_instance;
    m_instance = NULL;
    cout << "instance is deleted." << endl;
    }
}

void procedure()
{
    my_singleton::instance()->show_my_life();
    return;
}

int main()
{
    procedure();
    procedure();
    my_singleton::instance()->show_my_life();
    my_singleton::instance()->show_my_life();
    return 0;
}

运行结果:
instance creating...
i'm living at 0x9afa008
instance is already created.
i'm living at 0x9afa008
instance is already created.
i'm living at 0x9afa008
instance is already created.
i'm living at 0x9afa008

聪明的你能告诉我, 为什么析构的代码没有运行呢?
 
2007年08月14日 星期二 17:26
是在<stddef.h>文件中定义的.
 
2007年08月13日 星期一 9:52
最近几天在看关于C99方面的内容, 发现gcc3.0以上的版本都是支持C99标准的, 但是编译程序的时候要注意, 要加上
   -std=c99
参数才可以.

以下是我写的一段例子(stdver.c):
#include <stdio.h>

int main(void)
{
#ifdef __STDC__
     printf("%s\n", "stardard C");
#endif
#ifdef __STDC_VERSION__
     printf("%i\n", __STDC_VERSION__);
#endif
     return 0;
}

编译:
gcc -std=c99 -o stdver stdver.c

运行结果:
stardard C
199901
 
2007年05月16日 星期三 17:14

今天用STL来实现一个排序的问题. 于是调用了<algorithm>头文件中声明的sort函数, 并且还自定义了一个比较函数, 如下所示:

int SortCompare( const long &a, const long &b );
{
     return mapDict[a]>mapDict[b] ? 1 : -1;
}

我不假思索的写出来并运行了, 刷! 发现程序运行是错误:
Expression: invalid operator<

用了整整一个小时, 我才找到问题的答案, 告诫自已以后千万得细心:
问题出在了自定义比较函数定义上的问题, 不应该是int类型的, 而应该是bool类型:

bool SortCompare( const long &a, const long &b );
{
     return mapDict[a]>mapDict[b];
}

先前定义的那个函数, 无论是1还是-1, 变为bool类型后最终都是true. 这就可以出现既mapDict[a]>mapDict[b], 又mapDict[a]<mapDict[b];因为1和-1都true.

这个问题的出现提醒我以后写代码用逻辑类型的时候就一定用逻辑类型, 而不要用算术类型.

 
2007年01月07日 星期日 1:05

(转自vckbase)
大家知道,标准 string 类(不是说的 MFC 中的CString)中没有char * 的转换操作符,之所以这样,有两个理由:
1、隐式转换有可能导致不希望见到的结果。很多系统中都是合法的C代码与C++代码并存。在没有成为标准之前,C将 char * 作为通用指针来使用(void*是很久以后才加上的)。你可以想象在这样的系统中进行 char * 隐式转换所造成的混乱。
2、C 语言的字符串是以null结尾的,而在底层表示某个字符对象是与实现相关的。因此在某个需要null结尾字符数组的上下文中隐式转换字符串对象可能会死得很惨。
鉴于这些理由,C++ 标准委员会没有在 string 类中包含转换操作。如果必须作这样的转换,可以显式调用string::c_str()。

 
 
   
 
 
文章分类
 
   
 
文章存档
 
     
 
最新文章评论
  

[表情]
 

问题解决,谢谢分享~
 

做了没有?
 

太长知识了,这两天我也老犯这毛病
 

非常感谢~学习了~
   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu