C ++:安全使用longjmp和setjmp?
在linux / gcc的C ++中使用longjmp和setjmp关于以下方面是否安全?
- exception处理(我没有使用longjmp / setjmp实现exception处理,我想知道longjmp / setjmp对标准exception处理有什么副作用)
-
*this
指针 - 信号
- 智能指针(boost的共享和入侵指针)
- 还有什么你能想到的。
setjmp()
/ longjmp()
完全颠覆堆栈展开,因此也是exception处理以及RAII(一般的析构函数)。
标准中从18.7 / 4“其他运行时支持”
如果任何自动对象被抛出的exception将控制权转移到程序中的另一个(目标)点,那么在将控制权交给同一(目的)点的抛出点处对
longjmp(jbuf, val)
的调用具有未定义的行为。
所以底线是setjmp()
/ longjmp()
在C ++中不能很好地运行。
这不是特定于Linux或gcc; setjmp / longjmp和C ++如果使用longjmp离开具有析构函数的自动variables的上下文,那么它们不能很好地协同工作。
析构函数不会运行,这可能导致内存泄漏或其他不良行为。
我只知道这些命令,从来没有看到他们在实际应用中的行动。
恕我直言,可以肯定的说,使用它们并不安全:开发人员不会理解那些“不受欢迎”的API。
- ASP.NET自定义错误页面 – Server.GetLastError()为空
- Application.ThreadException和AppDomain.CurrentDomain.UnhandledException之间有什么区别?
- 如何在app.config中定义自定义TraceListener
- 如果不立即重新生成exception追踪,则隐藏
- 如何让ruby打印一个完整的回溯,而不是一个截断的?
- python:我怎么知道发生了什么types的exception?
- 如何捕捉.NET应用程序中的所有exception/崩溃
- Rubyexception – 为什么“其他”?
- UnobservedTaskException被抛出,但它由TaskScheduler.UnobservedTaskException处理程序和一个continuation OnlyOnFaulted处理程序处理