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

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就完了,动态分配干什么?


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