运行析构函数,当构造函数抛出异常时

时间:2012-11-08 10:45:28

标签: c++

  

可能重复:
  Is the destructor called if the constructor throws an exception?

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

#include <cstdio>

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

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

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

    }
}

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

3 个答案:

答案 0 :(得分:2)

在堆栈展开期间,仅调用完全构造的对象的析构函数。如果你的构造函数在它已经动态分配了一些内存之后抛出,那么析构函数将不会被调用而你会泄漏它(假设你使用了原始new,那就是)。

但是,当投掷时,成功构建的成员的构造者被调用。如果您使用智能指针或容器而不是原始new,则会正确清理资源。

答案 1 :(得分:0)

没有析构函数没有被执行。 但是,执行成功的任何成员变量的析构函数都将被执行。

答案 2 :(得分:0)

Is the destructor called if the constructor throws an exception?

中有一个非常详细的答案(以及在这种情况下进行适当资源管理的可能方法)