在虚拟成员函数中`删除这个'是安全的吗?

时间:2018-01-03 21:42:26

标签: c++ memory-management

我已经知道某些形式的“自杀”是安全的(被认为是合法的),但是,在虚拟成员函数中执行delete this是否特别安全?

注意,“安全”是指编译器生成的“代码”是否能够处理构造。

注意,我对这样做的利弊不感兴趣,只是我能否认为是安全的。

附带问题:语言标准是明确地还是隐含地要求实现支持delete this成语的任何形式?

我认为这不是Is delete this allowed?的副本。我的问题是关于在虚拟成员函数中是否安全。

以下是我要追求的内容概要

class FooBase {
protected:
    virtual void on_idle() { /* no-op by default */ }
};

class Foo : public FooBase {
    void on_idle() override final
    {
        delete this;
    }
};

请注意,虽然Foo需要堆分配,但其他子类可能不会。

1 个答案:

答案 0 :(得分:15)

是的,只要您之后不使用this,其他任何指向*thisthis的人都不能保证{{1}分配正是您将其删除为或拥有虚拟析构函数的类型。 (即,从不作为另一个对象的成员,在new中,作为自动存储变量,作为静态变量,作为临时变量,而不是std::vector,而不是new[]等等等等)

这包括调用非虚方法,虚方法,成员访问,调用dtors以及其他无数的东西;在你new(或确定性地从未使用过)之前,下一行的return;以外的任何其他内容以及以某种方式指向*this的每个其他指针都被清理。 / p>

作为一般规则,您必须对对象生命周期进行控制的程度非常高,以使delete this;安全,您可以将生命周期管理重构为外部到类和智能资源所有者,它可能将其状态保持为删除的delete this;尊重值类型,pImpl永远不能将其视为值。

除了更高的继承倾向之外,标准中没有任何内容使delete this;delete this;个对象更加危险。

virtual应该具有虚拟析构函数的所有类型都是delete this;,以避免继承问题。