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