这个问题来自 SetJmp/LongJmp:为什么会抛出一个段错误?
当我使用调试模式运行代码时,它确实按预期崩溃了。 但是如果我使用 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
. 所以释放的结果应该是对的,我的理解是错误的。
明夫:5.3
有问题的代码会导致未定义的行为。 程序不正确,没有预期的行为。 您不应该期望或惊讶于任何特定的输出或其他行为。
你使用哪个编译器?如果使用 g++ 编译器,即编程语言C++,函数b_helper
内联到函数b
中,函数b
内联到函数a
中,在启用优化的发布模式下。在这种情况下,不再有呼叫setjmp
和返回的路由。