抛出未处理的异常后过早离开的析构函数是否可以释放成员数据?

大师

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

  • 构造函数初始化成员数据(在ctor-init列表中),然后执行其主体。

  • 销毁程序执行其主体,然后销毁成员数据(在销毁阶段)。

  • 我知道析构函数不应引发异常,如果引发异常,则它本身应处理该异常。

**出于好奇的考虑:如果析构函数引发异常而没有处理该异常,那么该销毁它销毁成员数据还是将其释放吗?(因为它过早离开,因此跳过了破坏阶段)。

 struct Bar{};

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

     Bar b{};
 };

那么FooDtor的Dtor是否会b在抛出后释放而不处理异常?

**我知道我不应该这样做,而只是想了解更多有关异常处理的工作方式。谢谢!

埃雷里卡

如果析构函数在不处理异常的情况下引发异常,则应该销毁成员数据

是的。

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

b具有琐碎的类型,因此其“析构函数”不执行任何操作。但是,是的,该成员被销毁了。成员不是“被释放”的人。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从析构函数中抛出异常

std :: list的擦除成员函数是否为所有存储的元素调用析构函数?

从析构函数中抛出异常对于vtable是安全的吗?

如何从成员析构函数中捕获异常

是否可以清除析构函数中的向量

noexcept(false)析构函数会覆盖所有特殊成员函数的异常规范吗?

如何在C ++异常类析构函数中释放变量

是否可以为TypeScript类实现析构函数?

处理析构函数内部的异常(但不抛出)

C ++模板:检查类型的析构函数是否可以被“忽略”

如何检测构造函数是否为带有抛出析构函数的异常

在调用析构函数之前删除C ++动态成员数组

为什么我无法处理从析构函数外部抛出的异常?

析构函数限制-从析构函数访问托管成员

析构函数引发异常

SAP Crystal Report SetDataSource函数抛出“未处理的异常”

类的析构函数是否会自动为char *类型的数据成员释放内存?C ++

是否允许成员函数显式调用其类的析构函数

如果调用了子类的析构函数,是否可以停止对其基类的析构函数的调用?

默认析构函数是否释放成员指针指向的内存?

从析构函数调用非成员函数可以吗?

析构函数抛出System.NullReferenceException

析构函数/释放内存的问题

C++ 可以使析构函数不调用类成员的析构函数和基类的析构函数吗?

通过复制将对象传递给 CUDA 内核会调用其析构函数并过早释放内存

系统抛出未处理的异常

可以访问类数据成员并在析构函数中对它们执行操作吗?

抛出析构函数导致内存泄漏

抛出数据成员的析构函数