C ++在销毁之后使用引用对象

时间:2018-03-16 07:47:04

标签: c++ pointers constructor reference destructor

我正在尝试一些带引用和指针的东西,我找到了一些我根本不理解的东西。

这是我的代码:

#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()确实被调用,它的事件正确地完成了所有事情,为什么?

2 个答案:

答案 0 :(得分:2)

编译器警告在这里非常明显:

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;
           ^

答案 1 :(得分:2)

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

当您参与UB时,编译器不需要警告您,但 允许您假设您不会这样做,如果您这样做,您无法保证将会发生什么。该程序无效,任何都可能发生。