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