【发布时间】:2016-06-13 11:11:50
【问题描述】:
看看这段代码,它会导致程序在没有捕获异常的情况下终止。
#include <iostream>
#include <string>
#include <memory>
#include <stdexcept>
using namespace std;
struct test {
~test() noexcept(false) {
throw runtime_error("-my-cool-exception-");
}
};
int main()
{
try {
auto ptr = unique_ptr<test>(new test());
//test t; // this is ok, without unique_ptr<test> it works fine.
}
catch(exception& e) {
cout << "this is not called, the program is aborted";
cout << e.what() << endl;
}
return 0;
}
这个问题不同于堆栈溢出问题:throwing exceptions out of destructor。
不同的是,只有当我使用unique_ptr<test> 时,才不会捕获到异常。
您可以在这里查看实时代码,编辑和编译http://cpp.sh/9sk5m
【问题讨论】:
-
因为20.10.1.2.2要求删除不抛出异常。你违反了图书馆的先决条件。
-
我有一个完全依赖于此的库,不能破坏它。有解决方法吗?谢谢。
-
解决方法:修复您的库,在it bites you any further 之前立即修复。
-
如果您从析构函数中抛出异常,您的程序将无法继续。异常意味着“停止你正在做的任何事情并跳转到最近的处理程序”,但你不能停止破坏一个对象,这没有任何意义。当您停止制作一个对象时,即从构造函数中抛出,您会破坏已经制作的部分,语言会处理这些。但是,停止摧毁一个物体到底意味着什么?重新制作损坏的零件?这不可能。让它处于半毁状态? C++ 中没有半毁坏的对象。您唯一可以明智地做的就是中止。
-
@Ven 技术上没问题,也就是说,标准没有禁止,但逻辑上你的对象处于不明确的状态。
标签: c++ c++11 unique-ptr