class Foo{
private:
int i;
public:
Foo(int a)
{
i = a;
}
int getI() {return i;}
};
int main()
{
Foo* f;
if(true)
{
Foo g(1);
f = &g;
}
cout << f->getI() << endl;
return 0;
}
在上面的代码中,一旦退出if子句,Foo类的g对象就会超出范围。所以当执行cout语句时,它会打印1吗?
答案 0 :(得分:4)
行为未定义。它可以做任何事情。你必须绝对避免未定义的行为。
答案 1 :(得分:3)
会导致未定义的行为。从法律上讲,它可以做任何事情:它可以打印1,它可以打印42,它可以订购披萨或它可以结束宇宙中的所有生命。一切都是合法的结果。未定义的行为非常不好。
一旦g
超出范围,就不再定义,f
现在指向未定义的对象,解除引用f
,但不禁止,不支持任何定义的方式
答案 2 :(得分:1)
对象将被销毁,调用对象的析构函数。
指针仍将指向相同的内存位置。
访问它是一种未定义的行为,所以它可以做任何事情。
你不能假设这种行为,但是如果你的代码只包含这个代码,那么它很可能会有效地打印1,因为内存不会被覆盖。
但不要以为情况会这样!
答案 3 :(得分:0)
你得到Undefined behavior。你不知道cout会打印什么......
有时它可能会打印正确的值,但您可以确定演示的那一天它不正确...
答案 4 :(得分:0)
可能。或者它可能不会。该对象将被销毁,指针将指向内存中的相同地址。
但取消引用此指针是undefined behavior,这不是你想要的。事实上,一个程序的使用是什么,没人能说出它会做什么?