将删除此调用析构函数?

时间:2012-12-11 09:36:25

标签: c++ this destructor delete-operator

  

可能重复:
  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。如果有更好的解决方案,请提出建议。

4 个答案:

答案 0 :(得分:2)

是。 delete将调用析构函数。

您可能也有兴趣阅读this SO帖子。


答案 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 不会调用构造函数。 所以将变量声明为: foob​​ar a = new foobar();