可能重复:
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.那么编写这样的代码是错误的吗?请解释我
答案 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
变量内存空闲,您可以使用}
内的内存。