删除由文字赋值自动分配的内存

delete memory automatically allocated by assignment of a literal

本文关键字:分配 内存 文字 赋值 删除      更新时间:2023-10-16
char *str = "hi";
delete [] str;

我想知道为什么我们不能通过delete操作符释放内存?我得到一个异常'运行时错误',当这样做。

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

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

在这种情况下你不需要这样做!

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

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

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

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

从你的问题中需要注意的关键是

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

字符串字面值自动分配自动释放。你不能自己释放内存。

请注意,它们将在程序的整个生命周期内持续,而不仅仅是变量的作用域。

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

你没有在第一行使用new,所以不应该在第二行使用delete

,

char *str = "hi";

为名为str指针分配内存,该指针具有自动生存期。这里的自动是指编译器会替你处理。

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

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

std::string str = "hi";

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

这个问题问得好。但是常量字符串的业务远比我们看到的要复杂:编译器和链接器可以自由地在任何他们想要的地方维护只读字面值池。

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