【发布时间】:2009-09-03 21:32:09
【问题描述】:
在 linux/gcc 上的 C++ 中使用 longjmp 和 setjmp 是否安全?
- 异常处理(我没有使用 longjmp/setjmp 实现异常处理。我想知道 longjmp/setjmp 会对标准异常处理产生什么副作用)
-
*this指针 - 信号
- 智能指针(boost 的共享和侵入式指针)
- 你能想到的任何其他东西。
【问题讨论】:
标签: c++ linux exception gcc setjmp
在 linux/gcc 上的 C++ 中使用 longjmp 和 setjmp 是否安全?
*this指针【问题讨论】:
标签: c++ linux exception gcc setjmp
【讨论】:
longjmp() 只是跳转到代码中的新位置,因此它不会为调用 dtor 提供任何机会。该标准实际上没有那么具体——标准并没有说不会调用 dtors——它说所有的赌注都没有。在这种情况下,您不能依赖任何特定的行为。
longjmp() 是“安全的”,只要您没有将导致调用 dtor 的代码中的 longjmp 退出。然而,正如 David Thornley 在评论中指出的那样,即使在直接的 C 中正确使用 setjmp()/longjmp() 也可能很棘手——在 C++ 中它们是非常危险的。尽可能避免使用它们。
std::vector 和std::string 不会释放它的内存,@987654332 @不关闭它的文件和类似的东西。
它并不特定于 Linux 或 gcc;如果您使用 longjmp 离开存在带有析构函数的自动变量的上下文,则 setjmp / longjmp 和 C++ 不能很好地协同工作。
析构函数不会运行,这可能会导致内存泄漏或其他不良行为。
【讨论】: