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

时间:2009-09-03 21:32:09

标签: c++ linux exception gcc longjmp

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

  1. 异常处理(我没有使用longjmp / setjmp实现异常处理。我想知道longjmp / setjmp对标准异常处理会产生什么副作用)
  2. *this指针
  3. 信号
  4. 智能指针(boost的共享和侵入式指针)
  5. 你能想到的任何其他事情。

2 个答案:

答案 0 :(得分:58)

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

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

  

如果抛出的异常传输会破坏任何自动对象   控制到程序中的另一个(目标)点,然后在将控制转移到同一(目标)点的投掷点调用longjmp(jbuf, val)具有未定义的行为。

所以底线是setjmp() / longjmp()在C ++中不能很好地发挥作用。

答案 1 :(得分:6)

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

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