c++ - 在抛出未处理的异常后过早离开的析构函数是否会释放成员数据?
问题描述
据我所知,析构函数的工作顺序与构造函数相反:
构造函数初始化成员数据(在 ctor-init 列表中)然后执行其主体。
析构函数执行其主体然后销毁成员数据(在销毁阶段)。
我知道析构函数不应该抛出异常,如果它这样做了,那么它应该自己处理那个异常。
** 出于好奇:如果析构函数引发异常而不在那里处理它,那么它应该销毁成员数据还是不释放它们?(因为它过早离开,因此跳过了销毁阶段)。
struct Bar{};
struct Foo{
~Foo()noexcept(false){
throw 1024;// leaves here prematurely
}
Bar b{};
};
那么Foo
's Dtorb
在不处理异常的情况下抛出后会释放吗?
** 我知道我不应该这样做,只是为了了解更多异常处理的工作原理。谢谢!
解决方案
如果析构函数引发异常而不在那里处理它,那么它应该销毁成员数据
是的。
那么 Foo 的 Dtor 在不处理异常的情况下抛出后释放 b 吗?
b
有一个平凡的类型,所以它的“析构函数”什么都不做。但是,是的,该成员已被销毁。成员没有“被释放”。
推荐阅读
- oracle - PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效
- java - 模块信息 javadoc:@moduleGraph
- javascript - 如何在for循环中将包含子字符串的值分成单独的数组
- c++ - 将一维数组写入CSV C++中的不同列?
- python - 将 tz naive datetime 转换为 tz 感知从 0 分钟到 58 分钟
- javascript - 向对象数组中的每个对象添加新元素
- javascript - JavaScript如何唯一标识一个网站
- kubernetes - OpenShift 3.11 - 错误 0/23 个节点可用:16 个节点与节点选择器不匹配,7 个节点没有用于请求的 pod 端口的空闲端口
- javascript - Express + Mongoose Rest 可扩展项目
- cmake - 我真的需要指定 install-interface 包含依赖项吗?