有没有一种安全的方法在C ++中使用setjmp()和longjmp()?

时间:2010-08-09 19:00:58

标签: c++ exception coroutine

我的印象是在C ++中使用setjmp()longjmp()几乎可以保证堆栈的混乱,因为这些函数不执行展开,例如异常。但是,This MSDN page表示可以告诉Microsoft实现调用本地对象的析构函数,这意味着谨慎使用这些函数可能是安全的。

在C ++中使用setjmp()longjmp()时是否有可靠的方法来确保程序的正确性? C ++中的最佳实践表明异常最好不用于流控制,但在需要非常不寻常的流程的情况下(例如,协同程序和闭包),是否总是优先使用异常来代替这些函数?

2 个答案:

答案 0 :(得分:2)

如果你有一些非常奇怪的要求,不允许你正常控制程序的流程,使用条件/循环/中断,我宁愿使用jmp上的异常。

在某些情况下,可以使用异常来控制流量。我认为Boost.Graph的一个搜索函数抛出一个异常,可以从深度递归中快速返回调用者。

答案 1 :(得分:1)

我之前使用过它们,但仅限于一种情况:我在C语言中为OS类创建了一个OS内核;它们被用于异常处理。

我的理解是,在处理低级代码(如操作系统)时,它们用于异常处理。对于一般的C ++软件,我只使用try catch