删除指针后,str指针self的占用空间可以存在吗?

时间:2013-05-09 08:45:24

标签: c++ pointers

string *str=new string;
delete str;

删除对象后,str指针的占用空间是否会自行存在?

4 个答案:

答案 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 ++的运算符有两件事:

  • 调用object的析构函数
  • 将对象占用的内存部分标记为“free”,以便稍后可以将其重用于另一个对象。

通常情况下,班级在内存中保存的数据会保留一段时间,但几乎可以肯定,在某些时候有人会覆盖它们,所以不应该依赖它们的存在和凝聚力。

保存在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

时,它将被销毁(在堆栈上释放的内存)