这样做是否安全:
char* charArray = new char[10];
strcat(charArray, "qwertyuiop");
charArray[3] = '\0';
delete [] charArray;
会全部删除吗?或者那以后\0
不会是什么?我不知道我是不是在扔垃圾。
编辑:应该是strcpy
除了new[]
POD 类型不会对数组进行零初始化,并且strcat
会将终止写入'\0'
分配区域的末尾之外,一切看起来都很好:特别是delete
会删除整个块。
写到分配块末尾的原因是 10 个字符的字符串"qwertyuiop"
需要 11 个字节来存储。
如果您想写strcpy
而不是strcat
,那么这是安全且正确的。但您似乎对delete [] charArray
. 它不会删除字符,它会删除指向的内存charArray
。即使之后的内存也delete [] charArray
可能包含这些字符,但不能保证。
但是,如果您真的想写strcat
,并且它不是拼写错误,那么您的代码会调用未定义的行为,因为charArray
包含strcat
将尝试连接第二个字符串的垃圾。
释放在销毁对象后分配的delete[]
内存(对 dies 没有任何作用char
)。它不关心内容,即它会释放与分配一样多的对象。
请注意,使用strcat()
取决于空字符来查找字符串的结尾,并且从中返回的内存new char[n]
未初始化。你想从
*charArray = 0;
...您可能想要考虑strncat()
,或者更好的是,根本不使用它,而是使用std::string
.
不,这很好,整个数组都被删除了。delete
不看你给它的指针指向什么。只要您与new
和delete
匹配,new[]
就会delete[]
释放适量的内存。
(但请考虑使用std::string
而不是 char 数组,这样可以避免很多错误,比如你在数组末尾写的那个错误。)
该delete[]
语句不知道缓冲区中存储的内容(包括是否为字符串),因此它将删除所有 10 个字符。但是,您的strcat
调用溢出了数组的末尾(因为 C 字符串有一个零字节作为终止符),这可能会破坏您平台上的删除,并且通常不安全。