关于堆栈展开,C++标准表示:是堆栈展开与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();
}
现在:
- ,如果你运行它,是(捕获异常),你有堆栈展开的提示
- 如果您对
f();
发表评论并取消注释g();
(没有捕捉到该例外情况),则表示您没有解开堆栈的提示
因此,这两个实验似乎赞成上面的第一个项目符号; clang ++和g ++都同意结果(但它不是判别式)。
而且,在我看来很奇怪的标准,这是在指定和时间在这里留下了阴影对象现场时非常小心。
有人可以澄清吗?对于标准保证的未捕获异常,堆栈展开?如果是,在哪里?如果不是,为什么?
在发布的程序中,'s'在堆栈展开期间不会被破坏。它在'f()'返回后被销毁。 – aschepler