2006年8月2日

再次犯下C++错误

接着昨天的最后一段如下代码,本以为好使了,但后后来又出现了内存泄漏和内存溢出的现象。具体征兆是这样的。刚开始处理小文本的时候只是有内存泄漏的问题,内容占用越来越多。分析发现是代码中申请的动态字符数组没有释放,每次使用都申请一次,久而久之就越来越多了。

string strTemp = "";
strTemp = Processed();
int len = strTemp.size();
char* str = new char[len];
strcpy(str, strTemp.c_str() );
return str;

内存溢出的问题是在今天早上发现了。在处理超长文本的时候,总是出现莫名奇妙的程序崩溃。经过向pineapple请教后,得到的指点是可以用如下一段代码来代替。另外pineapple还指点我说如果把上面的那段代码中第四行修改为static char* str = new char[len];会出现内存溢出的情况,因为静态字符数组的申请只是在第一次调用的时候进行,后面的调用如果遇到超出第一次len长度的字符串拷贝 strcpy就会出现内存溢出。呵呵,感觉真的好险呀!下面的这段代码中的第一句其实也是一个静态变量,但是这个变量会比较好的解决内存泄漏和内存溢出的问题。下面的这段代码在俺的程序中现在运行正常,但是还需要进行深度的测试。据pineapple说,这种实现方法仍然存在一些问题的。呵呵,明日继续请教啦!

static std::string strTemp;
strTemp = Processed();
return (char*)strTemp.c_str();

谢谢pineapple!

4 条评论:

  1. Comment's author: Victor
    08/04/2006 09:39:07 AM
    你在分配数组的时候,会造成缓冲区溢出。看BBS上你发的帖子,我有个回复。

    回复删除
  2. Comment's author: zhp
    08/08/2006 02:10:09 PM
    bill的blog中这些精美的小插图很不错哦,都是在哪弄到的这些图?

    回复删除
  3. Comment's author: Bill_Lang
    08/10/2006 09:17:36 AM
    hehe,俺都是用Google和Baidu的图片搜索找到的。

    回复删除
  4. Comment's author: jnwang
    09/06/2006 04:07:06 PM
    没想到还有第二篇。-_-!
    static int a = 0;
    只有在第一次调用时才会执行这个定义语句,以后不再执行这个语句了。

    回复删除