如下代码:
main.cpp :
# include <iostream>
# include <csetjmp>
# include <stdexcept>
using namespace std ;
void do_work(jmp_buf context)
{
try
{
throw runtime_error("Ouch !") ;
}
catch(exception & e)
{
}
longjmp(context, -1) ; //BP1
}
int main(int, char *[])
{
jmp_buf context ;
try
{
if( setjmp(context) != 0 )
{
throw runtime_error("Oops !") ; //BP2
}
do_work(context) ;
}
catch(exception & e)
{
cout << "Caught an exception saying : " << e.what() << endl ;
}
}
我尝试调试它,但是该程序的行为异常。有时我可以越过第一个断点(BP1),然后在BP2崩溃,并且有时控制永远无法到达BP1,就像程序陷入无限循环一样。我的调试技巧不能多说。
这段代码是我得到的最少的代码,它表现出MinGW 4.5的奇怪行为。我还注意到:
do_work
函数调用,则程序可以正常运行。 try{ ... } catch(...){ }
内的do_work
块,则程序运行正常。 我知道C++代码中的
setjmp/longjmp
问题,但是我不得不使用它与某些旧版C代码进行接口(interface)。我的问题 :
感谢您的任何建议。
如有必要,请重新标记。
最佳答案
Unix上的longjmp(3)手册页显示:
我认为这解释了您的担忧,即“有时控制永远无法达到BP1”。
我认为“运转良好”不是可靠的判断。我宁愿期望它随机运行,并且通常会弄乱堆栈。
在将longjmp/setjmp与C++异常混合使用时,应考虑一些明确的建议,以避免崩溃和不确定的行为:
这个问题提到在用C++编写的程序中处理旧版C代码。在审查Boost库之一的过程中,在jpeg库中对sjlj问题进行了有趣的讨论。讨论时间很长,但这里是essence with recommended options。
关于c++ - 此代码是否包含隐藏的错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7938835/