【发布时间】:2014-01-28 20:05:50
【问题描述】:
在这段代码中,我引用了局部变量b,即使它超出了范围。但我是在同一个函数中做的,所以它可能还在堆栈上,对吧?我运行了这个程序,它可以工作,但我想知道它是否可以保证在所有实现上都可以工作。
#include <iostream>
void main()
{
int* a;
{
int b = 5;
a = &b;
}
std::cout << *a;
}
【问题讨论】:
-
这就是悬空指针的定义。
-
你的例子太简单了。在 cout 语句之前的一个更现实的示例中,您可以做很多事情,这可能会改变堆栈,破坏值。非常糟糕的做法。
-
不要误以为它“可以”工作的安全感。如果
b是一个分配资源(内存、打开文件等)的对象,并且它的 dtor 释放了这些资源(它应该),那么*a引用的“对象”的状态将是真实的垃圾。 -
如果你想保证某些东西会起作用,你应该遵守语言规则。这显然没有做到这一点。
-
好吧,我没看清楚。在我看来,是的,b 的析构函数已经被调用了,但是编译器如何将该堆栈位置用于任何其他目的?它不是在进入函数时“分配”位置,在离开函数时释放它吗?