是否需要销毁char * =" string"或者char * = new char [6]?
我假设char * =" string"
与char * = new char [6]
相同。我相信这些字符串是在堆而不是堆栈上创建的。那么,使用完它们后我是否需要销毁它们或者释放它们的内存,还是它们自己被销毁了?
解决方案
回答
我们不知道字符串文字存储在哪里。它甚至可能是只读内存,因此代码应为:
const char* c = "string";
就像任何其他动态分配的内存区域一样,应该删除新的char数组。
回答
他们不一样。第一个示例是一个常量字符串,因此绝对不会从堆中分配它。第二个示例是6个字符的运行时内存分配,该内存分配来自堆。我们不想删除第一个示例,但是需要"删除[]"第二个示例。
回答
I assume when I do char* = "string" its the same thing as char* = new char[6].
不,第一个是创建一个常量。修改它是未定义的行为。但是要回答你的问题;不,我们不必销毁它们。请注意,请尽可能使用std :: string
。
回答
不需要。只有在使用malloc函数(在C中)或者new运算符(在C ++中)手动分配内存时,才需要手动释放字符串。如果我们不使用malloc
或者new
,那么char *
或者字符串将在堆栈上创建或者作为编译时常量。
回答
new始终是一种分配,而内联定义字符串实际上会将数据嵌入程序本身,并且不能更改(某些编译器通过巧妙的技巧允许这样做,不要打扰)。
一些编译器键入内联字符串,以便我们不能修改缓冲区。
char* const sz1 = "string"; // embedded string, immutable buffer char* sz2 = new char[10]; // allocated string, should be deleted
回答
不,当你说:
const char* c = "Hello World!";
我们正在将c分配给"预先存在"的字符串常量,该常量与以下内容不同:
char* c = new char[6];
仅在后一种情况下,才在堆上分配内存。这样,我们就可以在完成后致电Delete。
回答
游戏的名称是"仅破坏我们创建的内容"。这是对:
malloc
/免费
calloc
/``免费`new
/delete
new []
/delete []
由于我们是使用new []
创建第二个字符串的,因此我们有责任用delete []
销毁它。完成后,调用delete [] string2
。
现在,如果代码非常复杂,并且使跟踪删除操作变得困难,请考虑使用作用域指针或者自动指针。 boost库中的boost :: scoped_ptr
类是一个不错的起点。还要研究RAII习惯用法,它非常方便且有用。