记忆管理问题

时间:2011-09-21 10:24:08

标签: c++ memory-management

  

可能重复:
  Can a local variable's memory be accessed outside its scope?

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

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

它也说 这里,p已成为悬空指针(指向内容未定义的内存) 但是这段代码告诉我结果5.那么编写这样的代码是错误的吗?请解释我

6 个答案:

答案 0 :(得分:7)

关键词“不再保证”。行为未定义。它可能会起作用,也可能不起作用,这取决于编译器决定做什么。

您不能依赖此行为。所以你永远不应该写那样的代码。

答案 1 :(得分:4)

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

这与你在Windows中删除某些内容时非常类似。你实际在做的是告诉系统你允许它使用这个空间来做别的事情。如果您尝试立即恢复该文件,那么很可能没有其他任何内容写入您的硬盘驱动器的那一部分了。如果您等了几天,那么很有可能会有另一个文件被写入。

悬空指针因此无法保证返回您最初存储在那里的值。

答案 2 :(得分:2)

我认为这是因为..地址持有p仍然在本地范围内具有地址x的值,但编译器现在可以自由地分配该空间。所以行为完全不明确。

答案 3 :(得分:2)

在此块之后:

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

变量x从堆栈中展开,因此占用的内存可以自由重用。它可以随时重复使用。

答案 4 :(得分:1)

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

不幸的是, UB 表现自己的一种方式是看起来有效的代码。

答案 5 :(得分:0)

}x变量内存空闲,您可以使用}内的内存。