2011-09-21 203 views
1

可能重复:
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; // ??? 
} 

它说也是 这里,对已经成为悬摆指针(指向的内存,其内容是不确定的) 但是这个代码显示了我结果5.so是错写这样的代码吗?请解释我

+2

看看这个** [基本上相同的问题] **(http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)**为了好的阅读。 – Anson

+0

检出[this](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope/“here”)post。 – Michael

回答

7

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

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

+2

谷歌为鼻恶魔。 – PlasmaHH

1

你的代码给你留下一个变量的地址不再存在。 C++标准不会声称该内存会发生什么情况。解引用指针将产生未定义的行为

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

2

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

2

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

可变x从栈展开,所以存储器它被占用是免费再利用。它可以随时重用。

4

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

这与在'删除'窗口中的内容时非常相似。你实际上在做什么是告诉系统你允许它使用这个空间来做其他事情。如果您立即尝试恢复文件,那么您的硬盘上还没有其他文件可以写入。如果您等了几天,那么很可能会有另一个文件被写入其中。

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

0

}x变量内存得到免费,你使用该内存出}