首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

new分配的字符串中包含有0,最后该怎么回收~

2012-02-25 
new分配的字符串中包含有0,最后该如何回收~~举个例子来说下charstr[] thisistest!! bufnewchar[255]

new分配的字符串中包含有0,最后该如何回收~~
举个例子来说下
char   str[]= "this   is   test!! ";
buf   =   new   char[255];
memset(buf,0,strlen(buf));
strcpy(buf,str);
delete[]   buf;           //这里回收就会出问题

请问这样的问题如何解决


[解决办法]
char *buf = new char[255];
memset(buf,0,255);
[解决办法]
char *buf = new char[255];
这块内存内容随机的,strlen(buf)是直到遇到0,所以很有可能会溢出,也就是超过255,delete的时候就出错了
[解决办法]

delete[] buf; //这里没有问题,回收时与内容无关。


不过这句有点问题:
memset(buf,0,strlen(buf));
-> memset(buf,0,255);

[解决办法]
char *buf = NULL;
char str[]= "this is test!! ";
buf = new char[255];
memset(buf,0,strlen(str));
strcpy(buf,str);
delete[] buf;

这样试试,看有没有问题?我认为问题和设置为0,没有关系,而是strlen(buf)计算的结果是不可知的,很有可能出现越界操作了
[解决办法]
char str[]= "this is test!! ";
buf = new char[255];
memset(buf,0,255);
strcpy(buf,str);
delete[] buf;

这里的strlen(buf);有可能不等于255;
[解决办法]
很明显这里错误
memset(buf,0,strlen(buf));
可能存在越界,所以delete的时候出错
[解决办法]
strlen(buf)!=255 哦


[解决办法]
没看出你举的例子有什么错,就算有错误也不是被delete的字符串有0的问题。

另一方面,既然你用new,说明你用的是C++;既然你用C++,直接用std::string就完了,动态分配干什么?


缓冲区溢出的就是你这种情况,以为自己申请了“比可能遇到的最长字符串还长的数组”。

热点排行