Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
关于以下内容,在 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++ 不能很好地协同工作。
析构函数不会运行,这可能会导致内存泄漏或其他不良行为。