【问题标题】:What will a pointer to a object point to outside the object scope in C++指向对象的指针将指向 C++ 中的对象范围之外的内容
【发布时间】:2013-10-01 05:32:04
【问题描述】:
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吗?

【问题讨论】:

  • 恶魔从你的鼻子里飞出来——或者,未定义的行为。

标签: c++ object pointers scope out


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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


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

      但不要以为会是这样!

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-02-09
            • 2011-10-01
            • 1970-01-01
            • 2011-02-11
            • 2014-01-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多