`delete this;`语句中发生了什么?

Nir*_*rMH 11 c++ memory

请考虑以下代码:

class foo
{
public:
    foo(){}
    ~foo(){}
    void done() { delete this;}
private:
    int x;
};
Run Code Online (Sandbox Code Playgroud)

在以下两个选项中发生了什么(并且有效吗?):

选项1:

void main()
{
   foo* a = new foo();
   a->done();
   delete a;
}
Run Code Online (Sandbox Code Playgroud)

选项2:

void main()
{
   foo a;
   a.done();
}
Run Code Online (Sandbox Code Playgroud)

delete a;选项1中的第二个语句是否会导致异常或堆损坏?

option2会导致异常或堆损坏吗?

Ste*_*sop 20

delete this; 允许,它删除对象.

您的代码片段都有未定义的行为 - 在第一种情况下删除已删除的对象,在第二种情况下删除具有自动存储持续时间的对象.

由于行为未定义,标准没有说明它们是否会导致异常或堆损坏.对于不同的实现,它可以是,也可以是,或者两者都没有,并且每次运行代码时它可能相同或不同.