C++ 面向对象自杀或删除此项;
以下使用MSVC9.0编译的代码运行并输出析构函数四次,这是合乎逻辑的C++ 面向对象自杀或删除此项;,c++,destructor,delete-operator,self-destruction,C++,Destructor,Delete Operator,Self Destruction,以下使用MSVC9.0编译的代码运行并输出析构函数四次,这是合乎逻辑的 #include <iostream> class SomeClass { public: void CommitSuicide() { delete this; } void Reincarnate() { this->~SomeClass(); new (this) SomeClass; } ~SomeClass() {
#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();
}
#包括
上课
{
公众:
无效杀螨剂()
{
删除此项;
}
虚空转世()
{
这个->~SomeClass();
新的(这个)某类;
}
~SomeClass()
{
std::cout commitsucide();
p=新类别;
p->转世();
p->~SomeClass();//第5行
p->commitsucide();
}
我认为主要的前4行代码不会导致未定义的行为(尽管不完全确定
删除这个;
东西).我想得到一个确认或不!您的假设是正确的。删除此;很好。最后一个
p->commitsucide();
给出了未定义的行为,因为您已经在“第5行”中销毁了对象。只要在删除后不尝试调用该对象的任何代码(甚至是析构函数),则“删除此”是可以的。因此,自删除对象应该只放在堆中,并且应该有一个私有析构函数来防止在堆栈上创建
我不知道直接调用析构函数是否会导致未定义的行为,但用户定义的删除运算符不会被执行。但是构造函数只被调用了3次,那么调用析构函数4次是如何合乎逻辑的呢?一旦类被调用,它就会爆炸(非常重要)数据成员。
new(此)SomeClass;
是有效代码(它构造对象,但不分配内存)。第5行没有错,但必须先重建对象,然后才能使用delete释放所用内存。好的,如果不调用析构函数,就无法释放new分配的内存。