在构造函数中"删除此"

ura*_*ray 26 c++ constructor destructor self-destruction delete-operator

我执行此代码时实际发生了什么?

class MyClass
{
    MyClass()
    {
        //do something
        delete this;   
    }
}
Run Code Online (Sandbox Code Playgroud)

tem*_*def 37

事实证明,在这种特殊情况下,代码是合法的,但你远离未定义的行为.

C++标准将对象的"生命周期"的概念定义为其构造函数完成运行的时间和析构函数开始运行的时间.它还明确指出(§3.8/ 5)

在对象的生命周期开始之前[...]如果对象将是或者是具有非平凡析构函数的类类型,并且指针被用作delete-expression的操作数,则程序具有未定义的行为.

由于对象的生命周期在构造函数完成之前尚未开始,因此在构造函数内部,this您引用的指针尚未开始其生命周期,delete在这种情况下尝试它是完全安全的.但是,如果您为该类编写析构函数,那么您将立即在此处遇到未定义的行为.

此外,如果更改构造函数以便在删除对象后尝试引用任何类的数据成员,则会得到未定义的行为.如果对象是在堆栈上分配的,那么您将获得未定义的行为.如果对象是静态的,您将获得未定义的行为.如果对象是使用分配的new,那么客户端将返回它的指针将无效并使用它将导致未定义的行为.一般来说,不要尝试这样做!

  • IMO,该段落是否适用值得怀疑。这些规则并不适用于正在建设中的课程。有一个问题报告,C++0x 修复了文本以插入“对于正在构造或销毁的对象,请参阅 12.7。否则......” (2认同)