0

可能重复:
如果构造函数抛出异常,是否调用析构函数?

我有一个问题要问你。当构造函数抛出异常时,是否执行析构函数?示例代码:

#include <cstdio>

struct Test
{
    Test (void)
    {
        throw 100;
    }

    ~Test (void)
    {
        printf ("~Test\n");
    }
};

int main (void)
{
    try
    {
        Test test;
    }
    catch (int value)
    {

    }
}

运行此代码时,不显示“~Test”。好的,我可以理解这种行为。假设 Test 有动态分配的成员,这些成员在构造函数中分配,在析构函数中删除。当在构造函数中分配异常后抛出异常时,它们会发生什么?

4

3 回答 3

2

在堆栈展开期间仅调用完全构造对象的析构函数。如果您的构造函数在它已经动态分配了一些内存之后抛出,则不会调用析构函数并且您将泄漏它(假设您使用 raw new,即)。

但是,在抛出期望时成功构造的成员的析构函数确实会被调用。如果您使用智能指针或容器而不是 raw new,则资源将被正确清理。

于 2012-11-08T10:51:38.327 回答
0

不,析构函数不会被执行。但是,任何已成功构造的成员变量的析构函数都将被执行。

于 2012-11-08T10:47:36.467 回答
0

There is a very detailed answer on this (and possible ways to do proper resource management in such a case) in Is the destructor called if the constructor throws an exception?

于 2012-11-08T10:52:19.387 回答