删除由文字赋值自动分配的内存
delete memory automatically allocated by assignment of a literal
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
处于自动(函数本地,堆栈)存储中,并且您有一个高速内存池处理程序,那么您可能会通过尝试释放它然后重用它来制造灾难性的混乱。(不要在家里尝试:-)
- 在c++中为我自己的基于指针的数组分配内存的正确方法
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 如果 const 不分配内存,为什么我可以获取 const 的地址?
- 在函数中分配内存时出现问题
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- constexpr new 如何分配内存?
- 在构造函数中分配内存失败是如何冒泡的
- LLVM 传递以在特定地址分配内存
- CudaMalloc 在分配内存时失败
- 为什么它在不分配内存的情况下工作正常
- 为什么在正确解除分配内存时出现内存泄漏?
- 如何通过 malloc 为队列数组分配内存?
- vector是否为std::移动的对象连续分配内存
- 删除类成员的动态分配内存的最佳方法是什么
- 唯一指针是否在堆或堆栈上分配内存?
- 如果不分配内存,我如何能够为变量创建和分配值?
- std::initializer_list 堆是否分配内存?
- 如何按顺序或在指定的地址分配内存?
- 是否可以使用 malloc 为类对象分配内存?
- 迭代器是否分配内存(如指针)?