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

标签 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() 确实被调用并且它事件正确地执行了所有操作,为什么?

最佳答案

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

当您进行 UB 时,编译器不需要警告您,但它可以假设您不会这样做,并且如果您无论如何都这样做,您无法保证会发生什么.该程序完全无效,任何事情都可能发生。

关于C++在销毁引用对象后使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49315511/

相关文章:

c++ - 大型复杂的构造函数还是私有(private)方法?

c++ - 使用指针重新复制字符数组并修剪前导空格

c++ - 寻找 C++ 的应用程序 GUI 库

c - 无法在头指针指向c的地方创建新节点?

c - C 中 &pointer 的结果是什么?

javascript - 是否可以使用多个构造函数来创建 1 个新实例?

c++ - 函数声明而不是在 C++ 中调用构造函数

c++ - 适用于 Windows Media Foundation 的 Visual Studio

c++ - 有人在 Xcode 3.2 中输入字符串有问题吗?

c - 二维字符数组中的 C 指针问题