【问题标题】:C++ using reference object after destroying it [duplicate]C ++在销毁参考对象后使用它[重复]
【发布时间】:2018-08-25 05:05:14
【问题描述】:

我用引用和指针尝试了一些东西,但我发现了一些我完全不理解的东西。

这是我的代码:

#include <iostream>

using namespace std;

class A
{
    public:
     A() { cout << "con\n"; }
    ~A() { cout << "des\n"; }

    void f() { cout << "bla" << endl; }
};

A &createA()
{
    A *a = nullptr;

    {
        A b;
        a = &b;
        cout << *&a << endl;
    }

    return *a;
}

int main()
{
    A &b(createA());
    cout << &b << endl;

    b.f();

    system("pause");

    return 0;
}

输出:

con
des
0058FE0B
0058FE0B
bla
Press any key to continue . . .

你可以看到成员函数 f() 仍然被调用,即使对象本身已经被销毁。为什么?我认为应该有一些错误,但是函数 f() 确实被调用并且它事件正确地完成了所有事情,为什么?

【问题讨论】:

  • 未定义的行为不保证错误或崩溃
  • 好吧,未定义的行为意味着将发生的事情可以是任何事情,甚至是看似合理的事情。该代码是错误的,它可以产生的任何东西都不必考虑。
  • OP 绝对应该阅读链接副本中接受的答案 - 这是一个可爱的类比

标签: c++ pointers constructor reference destructor


【解决方案1】:

编译器警告在这里非常不言自明:

main.cpp: In function 'A& createA()':
main.cpp:24:13: warning: function may return address of local variable [-Wreturn-local-addr]
     return *a;
             ^
main.cpp:19:11: note: declared here
         A b;
           ^

【讨论】:

    【解决方案2】:

    这是未定义的行为,简单明了。

    当你参与 UB 时,编译器不需要警告你,但它允许假设你不会这样做,如果你仍然这样做,你不能保证会发生什么.该程序完全无效,任何事情都可能发生。

    【讨论】:

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