C ++:安全使用longjmp和setjmp?

问题描述 投票:39回答:2

关于以下内容在linux / gcc上使用C ++中的longjmp和setjmp是否安全?

  1. 异常处理(我没有使用longjmp / setjmp实现异常处理。我想知道longjmp / setjmp对标准异常处理会产生什么副作用)
  2. *this指针
  3. 信号
  4. 智能指针(boost的共享和侵入指针)
  5. 你能想到的任何其他东西。
c++ linux exception gcc longjmp
2个回答
58
投票

setjmp() / longjmp()完全颠覆堆栈展开,因此异常处理以及RAII(一般的析构函数)。

从标准中的18.7 / 4“其他运行时支持”:

如果任何自动对象将被抛出异常转移控制转移到程序中的另一个(目标)点,那么在控制点转移到相同(目标)点的longjmp(jbuf, val)调用具有未定义的行为。

所以底线是setjmp() / longjmp()在C ++中表现不佳。


6
投票

它不是特定于Linux或gcc;如果你使用longjmp来保留带有析构函数的自动变量的上下文,setjmp / longjmp和C ++不能很好地协同工作。

析构函数不会运行,这可能导致内存泄漏或其他不良行为。

© www.soinside.com 2019 - 2024. All rights reserved.