2

可能重复:
C++:删除这个?

在堆上创建了一个类 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()

PS如果有更好的解决方案,请提出建议。

4

4 回答 4

2

是的。delete将调用析构函数。

您可能也有兴趣阅读SO 线程。


于 2012-12-11T09:37:44.157 回答
2

假设对象是动态分配的new:是delete this的,将导致调用析构函数。但是,您应该非常小心地删除this. 特别是,您需要确保没有后续操作尝试访问该类的任何成员。

此外,如果这是在未动态分配的内存上完成的(即使用new),这会导致未定义的行为。事实上,如果对象是通过分配的,这也会导致未定义的行为new[]

有关更多信息,请参阅此链接:http: //www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

这是另一个关于它的问题: 允许删除吗?

于 2012-12-11T09:38:56.377 回答
1

不,这不能保证。delete只有当我们确定它this是使用创建的时才应该被调用new

因此,根据当前对象的创建方式,我们可能会或可能不会调用析构函数。

所以假设“Foobar”对象是在堆栈上创建的(即没有new)。然后delete this有一个未定义的行为。

OTOH,如果它是使用“new”创建的,那么它delete this是安全的,并且会调用析构函数。

于 2012-12-11T09:51:54.637 回答
0

这完全取决于变量的定义方式。必须使用new关键字定义变量,否则delete不会调用构造函数。所以将变量声明为: foobar a= new foobar();

于 2012-12-11T10:01:27.807 回答