可能重复:
C++: Delete this?
在堆上创建了一个Foobar类。我想在它死后退出应用程序。当我调用die()函数时它必须死掉。在堆上创建了一些私有属性 - 我还需要删除它们。我写了那段代码:
Foobar::Foobar()
{
m_var = new int(1);
}
Foobar::~Foobar()
{
delete m_var;
exit(0);
}
void Foobar::die()
{
delete this;
}
问题出在delete this
行。如果我给它打电话,是否会调用Foobar::~Foobar()
?
P.S。如果有更好的解决方案,请提出建议。
答案 0 :(得分:2)
答案 1 :(得分:2)
假设使用new
动态分配对象:是的,delete this
将导致析构函数被调用。但是,删除this
时应该非常小心。特别是,您需要确保没有后续操作尝试访问该类的任何成员。
此外,如果在未动态分配的内存(即使用new
)上执行此操作,则会导致未定义的行为。实际上,如果通过new[]
分配对象,这也会导致未定义的行为。
有关更多信息,请参阅此链接: http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15
这是关于它的另一个问题: Is delete this allowed?
答案 2 :(得分:1)
没有。这不保证。只有在我们确定使用delete
创建this
时,才应调用new
。
因此,根据当前对象的创建方式,我们可能会也可能没有名为的析构函数。
因此假设'Foobar'对象是在堆栈上创建的(即没有new
)。然后delete this
有一个未定义的行为。
OTOH,如果它是使用'new'创建的,那么delete this
是安全的并将调用析构函数。
答案 3 :(得分:0)
完全取决于变量的定义方式。必须使用 new 关键字定义变量,否则 delete 不会调用构造函数。 所以将变量声明为: foobar a = new foobar();