是否需要销毁char * =" string"或者char * = new char [6]?

时间:2020-03-05 18:49:58  来源:igfitidea点击:

我假设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习惯用法,它非常方便且有用。