内存管理问题

memory management question

本文关键字:问题 管理 内存      更新时间:2023-10-16

可能重复:
可以使用局部变量';内存是否在其范围之外被访问?

我有以下关于记忆管理的问题,我读这篇文章的来源说,当变量超出范围时,该内存将不再保证存储变量的值示例代码给出

int main() {
  int *p;
  if (true) {
    int x = 5;
    p = &x;
  }
cout << *p << endl; // ???
}

它还说这里,p已成为一个悬空指针(指向内容未定义的内存(但是这个代码给我显示了结果5。所以写这样的代码是错误的吗?请向我解释

关键短语"不再保证"。行为是未定义的。它可能工作,也可能不工作,这取决于你的编译器决定做什么

你不能依赖这种行为。所以你永远不应该写这样的代码。

删除对象时,用于存储该对象的内存范围将被释放。这只意味着其他进程现在可以自由使用这个内存范围。存储在那里的值将保持不变,直到被另一个进程重写为止。

这相当类似于在windows中"删除"某些内容。你实际做的是告诉系统,你允许它将这个空间用于其他事情。如果你试图立即恢复文件,那么很有可能还没有其他内容写入你的硬盘。如果你等了几天,那么很有可能会有另一个文件被写在上面

因此,挂起指针不能保证返回最初存储在那里的值。

我认为这是因为。。p持有的地址在本地作用域中仍然具有地址x的值,但编译器现在可以自由分配该空间。所以这种行为是完全没有定义的。

在此块之后:

if (true) {
    int x = 5;
    p = &x;
}

变量x是从堆栈中展开的,所以它占用的内存可以自由重用。而且它可以在任何时候重复使用。

您的代码会留下一个不再存在的变量的地址。C++标准没有声明内存会发生什么。取消引用指针将产生未定义的行为

不幸的是,UB展示自身的一种方式是让代码看起来正常工作。

}之后,x变量内存将释放,您将使用}之外的内存。