【发布时间】:2014-09-17 16:15:31
【问题描述】:
在下面的代码中,a 的析构函数被调用了两次,第一次调用似乎被忽略了:
struct A1
{
int A;
A1(int a=0) : A(a) { std::cout << "ctor: " << A << "\n"; std::cout.flush(); }
~A1() { std::cout << "dtor: " << A << "\n"; std::cout.flush(); }
};
int main()
{
A1 a(1), *pa=new A1(2), *pb=new A1(3);
a.~A1();
pa->~A1();
delete pb;
std::cout << "'destructed' a.A = " << a.A << "\n"; std::cout.flush();
return 0;
}
输出:
ctor: 1
ctor: 2
ctor: 3
dtor: 1
dtor: 2
dtor: 3
'destructed' a.A = 1
dtor: 1
这里发生了什么?
【问题讨论】:
-
您有未定义的行为。当
a超出范围时,将调用其析构函数。此外,当a处于销毁状态时,您将打印a.A。 -
@40two:感谢链接 - 我使用了错误的搜索词,我自己没有找到。
标签: c++ destructor