玩char数组

时间:2012-03-25 16:21:48

标签: c++ arrays char garbage

做这样的事情是否安全:

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

是否会删除所有内容?或者\0之后的内容不会是什么?我不知道我是不是要留垃圾。

编辑:应为strcpy

5 个答案:

答案 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不会查看指向它的指针。只要您将newdelete匹配,将new[]delete[]匹配,就会释放适当数量的内存。

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

答案 4 :(得分:2)

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