下面用MSVC9.0编译的代码运行四次,输出Destructor ,符合逻辑。
#include <iostream>
class SomeClass
{
public:
void CommitSuicide()
{
delete this;
}
void Reincarnate()
{
this->~SomeClass();
new (this) SomeClass;
}
~SomeClass()
{
std::cout << "Destructor\n";
}
};
int main()
{
SomeClass* p = new SomeClass;
p->CommitSuicide();
p = new SomeClass;
p->Reincarnate();
p->~SomeClass(); //line 5
p->CommitSuicide();
}
我认为 main 中的前 4 行代码不会导致未定义的行为(尽管对此并不完全确定delete this;
)。我想要一个确认或< 确认反义词的占位符 >。但是我对第 5 行和第 6 行有严重的怀疑。允许显式调用析构函数,不是吗?但是在那之后对象的生命周期是否已经结束?也就是说,在显式调用析构函数之后调用另一个成员是否允许(定义)?
总而言之,上述代码的哪些部分(如果有)会导致未定义的行为(从技术上讲)?