我对C ++中的setjmp()和longjmp()有什么区别

最佳答案

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

void dont_do_this(jmp_buf jmp)
{
    std::string leakme("bad");
    longjmp(jmp, leakme.length());
}


字符串析构函数将不会被调用,并且您将泄漏内存。

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


  在本国际标准中,函数签名longjmp(jmp_buf jbuf,int val)具有更多受限制的行为。如果将引发控制权转移到程序中另一个(目标)点的抛出异常将破坏任何自动对象,则在将控制权转移到同一(目标)点的抛出点上对longjmp(jbuf,val)的调用具有未定义的行为。

关于c++ - 我对C++中的setjmp()和longjmp()有什么区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2271393/

10-11 19:04