删除指针后,str 指针自身的占用空间可以存在

after delete pointer, the occupied space for the str pointer self can exist?

本文关键字:指针 占用空间 存在 str 删除      更新时间:2023-10-16
string *str=new string;
delete str;

删除对象后,str 指针自身占用的空间可以存在吗?

是的,当然。变量 str 的类型为 string * 仍在范围内。一旦退出其当前范围,它将不复存在。例如,在函数的末尾或包含这些指令的{ }分隔块。

这就是为什么最好不要再指向曾经分配new string的地址,现在它不再有效。现有内存指向有效内存或 NULL 总是好的。

string *str = new string;
delete str;
str = NULL;

请注意,在第三行之后,您现在可以询问"str 是否指向有效的内存位置?",即"我可以安全地取消引用它吗?"。

   if (str != NULL) ...

另一方面,如果不将指针设置为 NULL,则无法执行此类检查。您应该记住,在删除指令之后,现在取消引用str是无效的,因此不这样做。显然,这是在招惹麻烦。

尽管正确,但这种代码(与删除匹配的新本地匹配,以及删除其目标内存位置后设置为 NULL 的任何活动指针(在将来更改时非常脆弱且容易出错。例如,如果函数不是那么简单,并且在新建和删除之间的路径中,您有条件和循环怎么办?如果将 str 作为参数传递给另一个函数怎么办?这个函数用指针做了什么:复制它,克隆它指向的对象...?

一种称为 RAII - 资源分配即初始化的技术(请参阅此问题(有助于创建防止内存泄漏和内存访问违规等类型的错误的设计。

注意:稍微直观一些,尽管在这个网站上建议了不太正统的RAII名称:UDSTMR - 使用析构函数语义来管理资源,或UTSTTC - 使用堆栈触发清理。看到这个答案。

删除运算符 C++ 做两件事:

  • 调用对象的析构函数
  • 将对象占用的内存部分标记为"空闲",以便以后可以将其重用于另一个对象。
通常,类在内存中保留的数据会

保留一段时间,但几乎可以肯定的是,在某个时刻有人会覆盖它们,所以人们不应该依赖它们的存在和凝聚力。

存储在变量str指针被保留,并且仍然指向内存的该部分。您可以重用此指针并通过再次调用运算符来分配另一个new string

<小时 />

出于好奇,旧的DOS游戏《模拟城市》有一个bug,导致释放后使用释放的内存。由于该游戏非常受欢迎,Windows设计人员为此游戏准备了一个特定的规则,该规则允许它安全地使用已释放的内存,以便它可以从Windows中运行。

之后

delete str

str仍然存在。这行代码释放str指向的内存,因此您可以再次new它。

int main()
{
string *str=new string;
delete str;
}

这样做的是,

创建一个名为 str 的容器,该容器能够指向字符串。现在,当您执行delete str时,实际的字符串将被删除。但指针仍然可以指向该内存位置。(不过,您可能不被允许访问它(。指针的作用域直到main },当您完成main时,将被销毁(堆栈上释放的内存分配(