代码之家  ›  专栏  ›  技术社区  › 

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

c++
  •  0
  •  · 技术社区  · 16 年前

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

    3 回复  |  直到 13 年前
        1
  •  12
  •   R Samuel Klatchko    16 年前

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

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

    不会调用字符串析构函数,这样会泄漏内存。

    函数签名longjmp(jmp\u buf jbuf,int val)在本国际标准中有更严格的行为限制。如果抛出的异常将控件传输到程序中的另一个(目标)点会破坏任何自动对象,则在将控件传输到同一个(目标)点的抛出点处对longjmp(jbuf,val)的调用具有未定义的行为。

        2
  •  10
  •   qrdl    16 年前

    一个( setjmp() )设置书签,其他( longjmp() )跳过去。

        3
  •  0
  •   Russell Borogove    13 年前

    把跳远当作非本地跳远。您可以使用setjmp设置一个点,然后使用longjmp跳回该点。阅读以下两个链接以更好地理解它

    http://www.cppreference.com/wiki/c/other/setjmp

    同时阅读longjmp以了解用法。