0
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;
 }

在上面的代码中, Foo 类的 g 对象一旦退出 if 子句,就会超出范围。那么当cout语句执行时,会打印1吗?

4

5 回答 5

4

行为未定义。它可以做任何事情。您必须绝对避免未定义的行为。

于 2013-09-25T14:45:34.340 回答
3

它将导致未定义的行为。从法律上讲,它可以做任何事情:它可以打印 1,它可以打印 42,它可以订购比萨饼,或者它可以结束宇宙中的所有生命。都是合法的结果。未定义的行为非常糟糕。

一旦g超出范围,它就不再被定义,f现在指向一个未定义的对象和解引用f,虽然没有被禁止,但不以任何定义的方式支持。

于 2013-09-25T14:46:31.253 回答
1

对象将被销毁,调用对象的析构函数。

指针仍将指向相同的内存位置。

访问它是一种未定义的行为,因此它可以做任何事情。


您不能假设这种行为,但如果您的代码仅包含此代码,那么它很有可能会有效地打印 1,因为内存不会被覆盖。

但不要以为会是这样!

于 2013-09-25T14:46:13.737 回答
0

你得到一个未定义的行为。你不知道 cout 会打印什么...

也许有时它会打印正确的值,但你可以确定演示当天它不会是正确的......

于 2013-09-25T14:46:06.030 回答
0

它可能。或者它可能不会。对象将被销毁,指针将指向内存中的相同地址。

但是取消引用这个指针是未定义的行为,这不是你想要的。确实,一个没人能说的程序有什么用呢?

于 2013-09-25T14:46:21.890 回答