GCC (libstdc++) 运行时如何在异常处于活动状态时决定终止 ()
How GCC (libstdc++) runtime decides to terminate() while an exception is active
我们知道,如果异常当前处于活动状态并且有另一个调用throw
,则会调用terminate
((。
想知道是什么原因导致这种情况与catch
块从内部throw
的情况区分开来吗?我假设如果一个catch
块正在执行,它表示一个活动的异常。
class exception_type{}
try{ ... throw obj; ...
}catch(exception_type& obj){
...
...
throw x;
...
}
从这个代码示例中,因为我们在catch
块中还有另一个throw
,它应该被动态封闭try
块中的另一个处理程序捕获。 所以这似乎是catch
内部throw
的有效使用。但此时我们已经有一个异常处于活动状态。为什么它不应该导致调用terminate
((?或者换句话说,gcc 的 c++ 运行时如何准确地识别已经存在一个异常处于活动状态并且需要调用terminate
((。
异常在catch
ed(当控件进入catch
部分时(立即停止"活动"。
这个答案的功劳要归功于@HolyBlackCat,他在回答中暗示了这一点。
throw
的响应是一个复杂的过程,其中C++运行时需要执行多个不同的操作。虽然实际过程可以通过运行时的实现来定义,但很少有共同点可以理解。这篇论文可以提供更多的启示。请参阅第 3.3 节。
在为throw
提供服务的过程中,开始搜索适当的catch
。这本身可能会导致当前堆栈帧的展开。展开堆栈帧的副作用是调用当前帧中对象的相应析构函数。再次调用析构函数的此操作将运行时置于用户的代码区域(不安全(。完成此操作后,我们再次进入运行时的区域(更安全(。
最后,当输入合适的catch
时,活动异常将被销毁并开始执行处理程序的代码。因此,所讨论的throw
不会遇到任何活动异常。
这也解释了为什么我们不应该从超出范围的析构函数中throw
异常。实际上,在析构函数中有一个try{....}catch(...)
块以防止任何不幸的terminate
((事件,这将是一个很好的做法。
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 在使用 gSoap 链接多个 SOAP 服务时启用保持活动状态
- 生成线程并在运行时执行其他操作,只要它处于活动状态
- 如何确定boost msm中的特定状态是否为活动状态
- GCC (libstdc++) 运行时如何在异常处于活动状态时决定终止 ()
- “B1的多重定义”,即使警卫处于活动状态
- 全局挂钩 DLL 仅在 C# 主窗口处于活动状态/前台时调用 C# 回调方法
- 保持 boost.process 在函数之外处于活动状态,该函数被调用
- 当 /Whorearchive选项处于活动状态时,无法使用Visual Studio链接到Windows上的自构建张量
- IBM Rhapsody c++ 代码生成 - 为什么总是在状态图周围放置一个活动状态
- 暂停游戏OnSteamVR叠加层处于活动状态
- 我怎么知道哪种上下文处于活动状态
- 如何使用QEvent::WindowBlocked,以便特定窗口始终处于活动状态?
- 如何保持异步函数中使用成员的shared_ptr对象的活动状态?
- 错误保持活动状态延迟
- 如何在C API中检查MySql连接是否处于活动状态
- 类的堆分配对象是否在其作用域之后但在 C++ 中调用其析构函数之前处于活动状态
- 当条件处于活动状态时停止 arduino 循环
- 如何防止我的dll在某个进程未处于活动状态时运行
- 过滤器抱怨对象保持活动状态