1

这样做是否安全:

char* charArray = new char[10];  
strcat(charArray, "qwertyuiop");  
charArray[3] = '\0';  
delete [] charArray;

会全部删除吗?或者那以后\0不会是什么?我不知道我是不是在扔垃圾。

编辑:应该是strcpy

4

5 回答 5

7

除了new[]POD 类型不会对数组进行零初始化,并且strcat会将终止写入'\0'分配区域的末尾之外,一切看起来都很好:特别是delete会删除整个块。

写到分配块末尾的原因是 10 个字符的字符串"qwertyuiop"需要 11 个字节来存储。

于 2012-03-25T16:24:59.757 回答
5

如果您想写strcpy而不是strcat,那么这是安全且正确的。但您似乎对delete [] charArray. 它不会删除字符,它会删除指向的内存charArray。即使之后的内存也delete [] charArray 可能包含这些字符,但不能保证。

但是,如果您真的想写strcat,并且它不是拼写错误,那么您的代码会调用未定义的行为,因为charArray包含strcat将尝试连接第二个字符串的垃圾。

于 2012-03-25T16:24:38.517 回答
3

释放在销毁对象后分配的delete[]内存(对 dies 没有任何作用char)。它不关心内容,即它会释放与分配一样多的对象。

请注意,使用strcat()取决于空字符来查找字符串的结尾,并且从中返回的内存new char[n]未初始化。你想从

*charArray = 0;

...您可能想要考虑strncat(),或者更好的是,根本不使用它,而是使用std::string.

于 2012-03-25T16:28:30.173 回答
2

不,这很好,整个数组都被删除了。delete不看你给它的指针指向什么。只要您与newdelete匹配,new[]就会delete[]释放适量的内存。

(但请考虑使用std::string而不是 char 数组,这样可以避免很多错误,比如你在数组末尾写的那个错误。)

于 2012-03-25T16:24:38.767 回答
2

delete[]语句不知道缓冲区中存储的内容(包括是否为字符串),因此它将删除所有 10 个字符。但是,您的strcat调用溢出了数组的末尾(因为 C 字符串有一个零字节作为终止符),这可能会破坏您平台上的删除,并且通常不安全。

于 2012-03-25T16:25:22.427 回答