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

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

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

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

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

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

所以底线是setjmp() / longjmp()在C ++中不能很好地运行。

这不是特定于Linux或gcc; setjmp / longjmp和C ++如果使用longjmp离开具有析构函数的自动variables的上下文,那么它们不能很好地协同工作。

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

我只知道这些命令,从来没有看到他们在实际应用中的行动。

恕我直言,可以肯定的说,使用它们并不安全:开发人员不会理解那些“不受欢迎”的API。