c ++中setjmp()和longjmp()有什么区别我很困惑

0 c++

c ++中setjmp()和longjmp()有什么区别我很困惑

R S*_*hko 12

不要在C++中使用setjmp/longjmp.问题是setjmp/longjmp是一个低级C API,无法正确处理堆栈展开.所以,如果你有这样的代码:

void dont_do_this(jmp_buf jmp)
{
    std::string leakme("bad");
    longjmp(jmp, leakme.length());
}
Run Code Online (Sandbox Code Playgroud)

不会调用字符串析构函数,你会泄漏内存.

由于这是未定义的行为,因此可能会发生更糟糕的事情.根据第18.7/4节:

函数签名longjmp(jmp_buf jbuf,int val)在本国际标准中具有更多限制行为.如果任何自动对象将被抛出的异常转移控制到程序中的另一个(目标)点,那么在控制点转移到相同(目标)点的long_mp(jbuf,val)调用具有未定义的行为.


qrd*_*rdl 10

One(setjmp())设置书签,other(longjmp())跳转到它.