首页 > 解决方案 > 在抛出未处理的异常后过早离开的析构函数是否会释放成员数据?

问题描述

据我所知,析构函数的工作顺序与构造函数相反:

** 出于好奇:如果析构函数引发异常而不在那里处理它,那么它应该销毁成员数据还是不释放它们?(因为它过早离开,因此跳过了销毁阶段)。

 struct Bar{};

 struct Foo{
     ~Foo()noexcept(false){
         throw 1024;// leaves here prematurely
     }

     Bar b{};
 };

那么Foo's Dtorb在不处理异常的情况下抛出后会释放吗?

** 我知道我不应该这样做,只是为了了解更多异常处理的工作原理。谢谢!

标签: c++exceptiondestructor

解决方案


如果析构函数引发异常而不在那里处理它,那么它应该销毁成员数据

是的。

那么 Foo 的 Dtor 在不处理异常的情况下抛出后释放 b 吗?

b有一个平凡的类型,所以它的“析构函数”什么都不做。但是,是的,该成员已被销毁。成员没有“被释放”。


推荐阅读