请考虑以下代码:
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; 允许,它删除对象.
您的代码片段都有未定义的行为 - 在第一种情况下删除已删除的对象,在第二种情况下删除具有自动存储持续时间的对象.
由于行为未定义,标准没有说明它们是否会导致异常或堆损坏.对于不同的实现,它可以是,也可以是,或者两者都没有,并且每次运行代码时它可能相同或不同.