16.15 of the C++ FAQ Lite 部分讨论了 delete this
,然后提到:
为什么这是真的?考虑这个代码:
class ISuicidal {
public:
virtual void suicide() = 0;
};
class MyKlass : public ISuicidal {
public:
MyKlass() {
cerr << "MyKlass constructor\n";
}
~MyKlass() {
cerr << "MyKlass destructor\n";
}
void suicide() {
delete this;
}
};
如此使用:
int main()
{
ISuicidal* p = new MyKlass;
p->suicide();
return 0;
}
在
p->suicide()
调用中, MyKlass
的析构函数按预期调用,即使 ISuicidal
没有虚拟析构函数。对我来说这是有道理的,因为在
MyKlass::suicide
中, this
的静态类型已知为 MyKlass*
,因此调用了正确的析构函数。通过将 typeid
调用放在 suicide
中,这很容易验证。那么FAQ条目是不准确的,还是我误解了它?
最佳答案
你是误会了。在ISuicide中实现自杀函数(即delete this),你会发现当this指针是基类调用delete时,它并没有调用派生类的析构函数。
关于c++ - 执行 "delete this"时缺少虚拟析构函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7440727/