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

Kri*_*ege 9 c++ memory-management

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

注意,"安全",我的意思是编译器生成的"代码"是否能够处理构造.

注意,我对这样做的利弊并不感兴趣,只是我能考虑是否安全.

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

我不认为这是重复的是删除这个允许吗?.我的问题是关于在虚拟成员函数中是否安全.

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

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

class Foo : public FooBase {
    void on_idle() override final
    {
        delete this;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

Yak*_*ont 15

是的,只要你this之后不使用,并且其他任何人都没有指针*this,并且this保证new 按照你正在删除它的类型或拥有虚拟析构函数来分配.(即,永远不要作为另一个对象的成员std::vector,作为自动存储变量,作为静态变量,作为临时,不是new[],不是放置new等等)

这包括调用非虚方法,虚方法,成员访问,调用dtors以及其他无数的东西; 除了return;在下一行之外的几乎任何东西以及之前*this被清理的所有其他指针(或确定性地从未使用过).delete this;

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

除了更高的继承倾向之外,标准中没有任何内容会对对象造成delete this;额外的危险virtual.

所有类型都delete this;应该具有虚拟析构函数或者final为了避免继承问题.

  • 并确保这是由new创建的 (9认同)