在下面的代码中,析构函数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;
}
Run Code Online (Sandbox Code Playgroud)
ctor: 1
ctor: 2
ctor: 3
dtor: 1
dtor: 2
dtor: 3
'destructed' a.A = 1
dtor: 1
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
Bil*_*nch 10
除非你真的知道你在做什么,否则你永远不应该直接调用对象的析构函数.相反,允许在delete对象(已分配对象new)或超出范围时调用析构函数.
在您的情况下a.~A1();将导致未定义的行为,因为当a超出范围时您将再次调用析构函数.
| 归档时间: |
|
| 查看次数: |
168 次 |
| 最近记录: |