指向对象的指针指向C ++中对象作用域之外的内容

时间:2013-09-25 14:43:53

标签: c++ object pointers scope out

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吗?

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

会导致未定义的行为。从法律上讲,它可以做任何事情:它可以打印1,它可以打印42,它可以订购披萨或它可以结束宇宙中的所有生命。一切都是合法的结果。未定义的行为非常不好。

一旦g超出范围,就不再定义,f现在指向未定义的对象,解除引用f,但不禁止,不支持任何定义的方式

答案 2 :(得分:1)

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

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

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


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

但不要以为情况会这样!

答案 3 :(得分:0)

你得到Undefined behavior。你不知道cout会打印什么......

有时它可能会打印正确的值,但您可以确定演示的那一天它不正确...

答案 4 :(得分:0)

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

但取消引用此指针是undefined behavior,这不是你想要的。事实上,一个程序的使用是什么,没人能说出它会做什么?