繁体   English   中英

使用(未)捕获的异常展开堆栈

[英]Stack unwinding with (un)caught exceptions

堆栈展开

在堆栈展开部分有以下两段:-

一旦构造了异常 object,控制流向后工作(向上调用堆栈)直到到达 try 块的开头,此时所有关联的 catch 块的参数按照出现的顺序与类型进行比较异常 object 以查找匹配项(有关此过程的详细信息,请参见 try-catch)。 如果未找到匹配项,则控制流继续展开堆栈,直到下一个 try 块,依此类推。 如果找到匹配项,则控制流跳转到匹配的 catch 块。 随着控制流在调用堆栈中向上移动,将为所有具有自动存储持续时间且已构建但尚未销毁的对象调用析构函数

然后我们有

如果抛出异常但未被捕获,包括转义 std::thread 的初始 function、主 function 以及任何 ZA81259CEF8E959C23:97ZD456E5 的构造函数或析构函数的异常,则 std:97ZD 或称为 thread.local objects,则对于未捕获的异常,是否发生任何堆栈展开是实现定义的。

现在我有点困惑,起初它说当我们向上移动堆栈寻找匹配捕获的尝试时,调用析构函数,然后它说如果未捕获异常,则不保证调用析构函数。 它是哪一个? 运行时是否会跟踪可能被调用的析构函数,直到它最终找到匹配的捕获,然后才以相反的构造顺序调用它们? 此外,在 catch 执行之前是否调用了析构函数?

您似乎认为搜索匹配的catch()时调用了析构函数。 不一定是这样。

从程序中的当前位置到匹配的catch()的析构函数最终会被调用,但这并不需要在找到 catch 之前开始发生。

第二个块只是声明没有找到任何捕获,然后程序一旦做出决定就可以立即终止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM