char *str = "hi";
delete [] str;
我想知道为什么我们不能通过删除操作符释放内存?这样做时我得到exception'运行时错误'。
char *str = "hi";
自动分配内存并在其中写入字符串
所以删除运算符应该工作,还是我错了这个假设?
答案 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
位于自动(函数本地,堆栈)存储中并且您有一个高速内存池处理程序,那么您可能会通过尝试进行灾难性的混乱释放它然后重复使用它。 (不要在家里试试这个: - )