首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >c++标准是否保证在异常情况下展开堆栈?

c++标准是否保证在异常情况下展开堆栈?
EN

Stack Overflow用户
提问于 2016-10-11 00:45:21
回答 1查看 2.4K关注 0票数 20

关于堆栈展开,c++标准规定:

异常在完成异常对象(except.throw)的初始化之后被认为是未捕获的,直到异常处理程序(except.handle)的激活完成为止。这包括堆栈展开。

在当前标准的par 15.5.3。我试着理解最新的句子(This includes stack unwindings)指的是什么:

  • 是否假定编译器必须负责展开堆栈?
  • 或者,它是说是否展开堆栈取决于编译器?

这个问题源于下面的代码片段:

代码语言:javascript
复制
#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++都同意结果(但这不是一个判别式)。

而且,在我看来非常奇怪的是,在指定对象的生存时间和持续时间时非常小心的标准在这里留下了阴影。

有人可以澄清一下吗?标准是否保证对未捕获的异常进行堆栈展开?如果是,在哪里?若否,原因为何?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-11 00:47:42

是否为标准所保证的未捕获的异常进行堆栈展开?

如果没有找到匹配的处理程序,则调用函数std::terminate();在调用std::terminate()之前是否展开堆栈是由实现定义的。

所以它是由实现定义的,否则。

如果没有,为什么?

如果发生未捕获的异常,则该标准会导致调用std::terminate。表示程序执行结束的。如果您有某种特定于平台的方法来记录有关系统状态的信息,那么您可能不希望该状态被堆栈展开所干扰。

如果你不这么做..。无论哪种方式,你都不在乎。

如果您确实需要堆栈始终处于展开状态,那么可以将main代码(以及任何线程函数)放入try {} catch(...) {throw;}块中。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39962999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档