这个问题来自 SetJmp/LongJmp: Why is this throwing a segfault?
当我使用调试模式时,运行它确实崩溃的代码。 但如果我使用release,它将输出如下:
1 setjmping a_buf
2 calling b // loop start
3 entering b_helper
4 longjmping to a_buf
5 longjmping to b_buf
6 returning from b_helper // loop
2 calling b
3 entering b_helper
4 longjmping to a_buf
5 longjmping to b_buf
6 returning from b_helper
...
根据我的理解,longjmp
可以被视为return
,因此b_helper
的堆栈内存将被删除,访问将变为非法。使程序崩溃变得合理。
但是为什么它在release
中给出了不同的行为?看起来return
的行为与longjmp
相似。
所以释放的结果是正确的,我的理解是错误的。
Mingw:5.3
答案 0 :(得分:3)
相关代码会导致undefined behaviour。该程序不正确,没有预期的行为。您不应期望或对任何特定输出或其他行为感到惊讶。
答案 1 :(得分:0)
您使用哪种编译器?如果使用g ++编译器,即编程语言是C ++,函数b_helper
将内联到函数b
中,函数b
将内联到函数a
中。启用优化的发布模式。在这种情况下,不再需要调用setjmp
并返回。