string *str=new string;
delete str;
删除对象后,str指针的占用空间是否会自行存在?
答案 0 :(得分:3)
是的,当然。类型为str
的变量string *
仍在范围内。一旦现有范围退出,它将不复存在。例如,在函数末尾或{ }
- 包含这些指令的分隔块。
这就是为什么停止指向曾经分配new string
的地址以及现在不再有效的地址的好习惯。现有的指向有效内存或NULL总是好的。
string *str = new string;
delete str;
str = NULL;
请注意,在第三行之后,您现在可以询问“str是否指向有效的内存位置?”,即“我可以安全地取消引用吗?”。
if (str != NULL) ...
如果没有将指针设置为NULL,另一方面,您无法进行此类检查。您应该记住,在删除指令之后,它现在对取消引用str无效,因此不会这样做。显然,这是在寻找麻烦。
虽然正确,但这种代码(一个新的本地匹配删除,以及任何在删除其目标内存位置后设置为NULL的生命指针)非常容易受到攻击,并且在将来发生更改时容易出错。例如,如果函数不是那么简单,并且在new和delete之间的路径中你有条件和循环怎么办?如果将str作为参数传递给另一个函数怎么办?这个函数对指针做了什么:复制它,克隆它指向的对象......?
一种称为 RAII - 资源分配正在初始化的技术(参见this question)有助于创建防止内存泄漏和内存访问冲突等类型错误的设计。
注意:稍微直观一点,虽然在这个网站上建议使用不太正统的RAII名称:UDSTMR - 使用析构函数语义管理资源,或UTSTTC - 使用堆栈触发清理。请参阅this answer。
答案 1 :(得分:2)
删除C ++的运算符有两件事:
通常情况下,班级在内存中保存的数据会保留一段时间,但几乎可以肯定,在某些时候有人会覆盖它们,所以不应该依赖它们的存在和凝聚力。
保存在str
变量中的指针仍然指向该部分内存。您可以重新使用此指针并再次通过调用string
运算符来分配另一个new
。
作为一个好奇心,旧的DOS游戏SimCity有一个错误,导致解除分配的内存在释放后使用。由于游戏如此受欢迎,Windows设计人员为此游戏准备了一个特定规则,允许它安全地使用解除分配的内存,以便它可以在Windows中运行。
答案 2 :(得分:1)
在
delete str
str
仍然存在。这行代码会释放str
指向的内存,因此您可以再次new
。
答案 3 :(得分:0)
int main()
{
string *str=new string;
delete str;
}
这是做什么的,
创建一个名为str
的容器,它能够指向一个字符串。现在,当您执行delete str
时,实际字符串将被删除。但指针仍然可以指向该内存位置。 (但可能不允许您访问它)。这个指针的范围一直到}
的{{1}},当你完成main