关于堆栈展开,c++标准规定:
异常在完成异常对象(except.throw)的初始化之后被认为是未捕获的,直到异常处理程序(except.handle)的激活完成为止。这包括堆栈展开。
在当前标准的par 15.5.3。我试着理解最新的句子(This includes stack unwindings
)指的是什么:
这个问题源于下面的代码片段:
#include <iostream>
#include <exception>
struct S{
S() { std::cout << " S constructor" << std::endl; }
virtual ~S() { std::cout << " S destructor" << std::endl; }
};
void f() {
try{throw(0);}
catch(...){}
}
void g() {
throw(10);
}
int main() {
S s;
f();
//g();
}
现在:
因此,这两个实验似乎支持上面的第一个项目;clang++和g++都同意结果(但这不是一个判别式)。
而且,在我看来非常奇怪的是,在指定对象的生存时间和持续时间时非常小心的标准在这里留下了阴影。
有人可以澄清一下吗?标准是否保证对未捕获的异常进行堆栈展开?如果是,在哪里?若否,原因为何?
发布于 2016-10-11 00:47:42
是否为标准所保证的未捕获的异常进行堆栈展开?
如果没有找到匹配的处理程序,则调用函数
std::terminate()
;在调用std::terminate()
之前是否展开堆栈是由实现定义的。
所以它是由实现定义的,否则。
如果没有,为什么?
如果发生未捕获的异常,则该标准会导致调用std::terminate
。表示程序执行结束的。如果您有某种特定于平台的方法来记录有关系统状态的信息,那么您可能不希望该状态被堆栈展开所干扰。
如果你不这么做..。无论哪种方式,你都不在乎。
如果您确实需要堆栈始终处于展开状态,那么可以将main
代码(以及任何线程函数)放入try {} catch(...) {throw;}
块中。
https://stackoverflow.com/questions/39962999
复制相似问题