关于以下内容在linux / gcc上使用C ++中的longjmp和setjmp是否安全?
*this
指针答案 0 :(得分:58)
setjmp()
/ longjmp()
完全破坏堆栈展开,因此异常处理以及RAII(一般的析构函数)。
从标准中的18.7 / 4“其他运行时支持”:
如果抛出的异常传输会破坏任何自动对象 控制到程序中的另一个(目标)点,然后在将控制转移到同一(目标)点的投掷点调用
longjmp(jbuf, val)
具有未定义的行为。
所以底线是setjmp()
/ longjmp()
在C ++中不能很好地发挥作用。
答案 1 :(得分:6)
它不是特定于Linux或gcc;如果你使用longjmp来保留带有析构函数的自动变量的上下文,setjmp / longjmp和C ++不能很好地协同工作。
析构函数不会运行,这可能会导致内存泄漏或其他不良行为。