删除通过分配文字自动分配的内存

时间:2014-05-10 18:43:57

标签: c++

char *str = "hi";

delete [] str;

我想知道为什么我们不能通过删除操作符释放内存?这样做时我得到exception'运行时错误'。

char *str = "hi";自动分配内存并在其中写入字符串 所以删除运算符应该工作,还是我错了这个假设?

4 个答案:

答案 0 :(得分:4)

  

我想知道为什么我们不能通过删除操作符释放内存?

在这种情况下你不需要!

  

char *str = "hi";自动分配内存并在其中写入字符串。

不,不!这一切都发生在编译时(甚至应该给你一个警告) 你没有分配str,你分配了一个指向const char*文字的指针(允许编译器放在实现所需的任何地方),因此你不能删除它。

使用new()delete管理的动态分配意味着类似

char* str = new char[3];
strncpy(str,"hi",3);

// ...
delete [] str;

答案 1 :(得分:1)

您的问题需要注意的关键是

  
    

char *str = "hi"; 自动分配内存并在其中写入字符串

  

字符串文字自动分配自动解除分配。你不能自己释放记忆。

请注意,它们将持续程序的生命周期,而不仅仅是变量的范围。请参阅this SO answer

答案 2 :(得分:1)

delete用于取消分配最初使用new分配的对象。 delete[]用于取消分配最初使用new[]分配的数组。

您在第一行中没有使用new,因此不应在第二行使用delete

具体地,

char *str = "hi";

为名为str指针分配内存,该指针具有自动生存期。这里的自动意味着编译器会为您处理它。

指针指向一个字符串文字"hi",在编译时静态分配一次,永远不能更改。实际上,你的指针应该是const。

现在,如果我们将您的代码更改为

std::string str = "hi";

动态分配会发生,因为std::string会复制您的字符串文字,但它也会为您释放该副本。它可能会在内部使用new[]delete[]

答案 3 :(得分:0)

这是一个公平的问题。但是,对于常量字符串的业务而言,除了满足需求外,还有更多的东西:编译器和链接器可以随意维护只读文字池。

实际上,如果示例中的str位于自动(函数本地,堆栈)存储中并且您有一个高速内存池处理程序,那么您可能会通过尝试进行灾难性的混乱释放它然后重复使用它。 (不要在家里试试这个: - )