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

标签 c++

<分区>

Possible Duplicate:
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 具有动态分配的成员,这些成员在构造函数内部分配并在析构函数中删除。当它们在构造函数中分配后抛出异常时,它们会发生什么?

最佳答案

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

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

关于c++ - 运行析构函数,当构造函数抛出异常时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13287450/

相关文章:

c++ - C++ 中是否有标准的 3d vector 类

c++ - 无法让 modf() 在多线程中工作

c++ - 使用 std::vector::erase 和 const_iterators

c++ - 指向类模板方法的 void 指针的 vector

C++ 官方运算符名称/关键字

c++ - SearchPathW 卡住

c++ - HLSL 和 DX Skybox 问题(产生接缝)

c++ - 更改文件/路径扩展名

c++ - QThread:线程仍在运行时被销毁,QMutex 被销毁

c++ - 使用模板取消分配动态二维数组