- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道 C++ 中的当前规则是这样说的:
if a destructor throws while already stack unwinding because of a exception then
std::terminate
is called.
在探索为什么规则是这样的时候,我遇到了下面代码中描述的情况。
X
的析构函数抛出。
Y
在它自己的析构函数中删除一个 X
。
因此 Y
的析构函数抛出。
我不清楚 Y
抛出 (3.) 是否应该按照标准规则触发 std::terminate
。我希望它不会,并且针对 gcc
的测试如我希望的那样运行。
熟悉标准法律术语的人可以澄清一下吗? (3.) 是否应该触发 std::terminate
?
#include <iostream>
struct X {
~X() noexcept(false) {
std::cout << "Destroying X\n";
throw std::runtime_error("Exception");
}
};
struct Y {
X * x_;
explicit Y(X * x) : x_{x} { }
~Y() noexcept(false) {
std::cout << "Destroying Y\n";
delete x_;
}
};
int main() {
try {
Y y(new X());
std::cout << "Living\n";
}
catch (const std::exception & e) {
std::cout << "Caught " << e.what() << '\n';
}
}
使用 g++ 版本 5.4.0-6ubuntu1~16.04.9 和 --std=c++17
我得到:
Living
Destroying Y
Destroying X
Caught Exception
最佳答案
标准在[except.terminate]p1.4中说:
- when the destruction of an object during stack unwinding terminates by throwing an exception, or
2) 发生是因为 y
超出范围。 1) 抛出异常,开始堆栈展开。在堆栈展开期间,更具体地说是在销毁 Y
时 - 即 2)。它抛出一个异常,因此满足该点并调用 std::terminate
。
这正是您的代码正在做的事情,除了重要的一点:在堆栈展开期间。堆栈展开不会在范围结束时发生,它只会在抛出异常并超出抛出的当前范围时发生。
Y
没有因为异常而被销毁。添加 throw 1;
以查看对 std::terminate
的调用。
因此,该条款不适用,您的代码确实有效。
关于c++ - 删除从析构函数调用的抛出析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49290248/
我开始考虑在我 future 的项目或重构中实现控制反转容器,我想知道在正确设计依赖项时哪些原则(除了 GoF 模式)可能需要牢记在心。假设我需要构建一个简单的控制台应用程序,如果它可以访问互联网,它
假设我有一个 RxC contingency table 。这意味着有 R 行和 C 列。我想要一个维度为 RC × (R + C − 2) 的矩阵 X,其中包含行的 R − 1 “主效应”以及列的
我正在尝试使用 DKMS 为正在运行的内核 (4.4) 构 build 备树覆盖。我天真的 Makefile 如下: PWD := $(shell pwd) dtbo-y += my-awsome-o
我有一个 sencha touch 项目。我是用 phonegap 2.9 构建的,并且可以正常工作 device.uuid 返回到设备 ID。当我尝试使用 3.1 device.uuid 构建时抛出
我在安装了 Xcode 4.5.1 的 Mt Lion 上运行。 默认情况下,当我构建并部署到 iOS 5.1 设备时,显示会在我旋转设备时旋转,但当我部署到 iOS 6 模拟器或运行 iOS 的 i
我正在尝试使用 Google Analytics Reporting API v4 构建多折线图。 一张图表,其中我按每天的 session 计数为每个设备(台式机/平板电脑/移动设备)设置了一条线。
我一生都无法使用 xcode 组织者“自动设备配置”中的“团队配置配置文件”在 xcode 4.0.1 中将我的应用程序构建到我的 iPad 上。 该应用程序完美地构建到模拟器,但当我构建到 iPad
我是一名优秀的程序员,十分优秀!