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/

10-09 05:59