可能重复:
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有动态分配的成员,这些成员在构造函数中分配并在析构函数中删除。当在构造函数中分配异常后抛出异常时,它们会发生什么?
答案 0 :(得分:2)
在堆栈展开期间,仅调用完全构造的对象的析构函数。如果你的构造函数在它已经动态分配了一些内存之后抛出,那么析构函数将不会被调用而你会泄漏它(假设你使用了原始new
,那就是)。
但是,当投掷时,成功构建的成员的构造者做被调用。如果您使用智能指针或容器而不是原始new
,则会正确清理资源。
答案 1 :(得分:0)
没有析构函数没有被执行。 但是,执行成功的任何成员变量的析构函数都将被执行。
答案 2 :(得分:0)
在Is the destructor called if the constructor throws an exception?
中有一个非常详细的答案(以及在这种情况下进行适当资源管理的可能方法)