46

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

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

2 回答 2

65

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

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

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

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

于 2009-09-03T21:36:55.010 回答
6

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

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

于 2009-09-04T21:51:42.420 回答