【发布时间】: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