c/c++语言开发共享链接到C ++库时在C中使用setjmp和longjmp

我想在C程序中使用setjmp和longjmp,该程序链接到用C ++实现的库(但有一个C API)。

C ++代码确实进行了动态内存分配,指针通过API传递,但只要代码的C端正确管理那些(不透明)对象,使用longjmp时就不会有任何混乱,对吧?

我知道在C ++代码中使用这些函数是不安全的,但它是否应该在链接到C ++代码的C代码中安全?

    从C代码调用C ++函数这一事实并不会使setjmp和longjmp比以往更不安全。

    重要的是,如果您的库分配资源,您必须具有恢复代码,以确保在调用longjmp后正确释放它们。 虽然这可能很容易为您自己的分配,但C ++库可能很难或不可能,这取决于您使用的C接口的结构。

    通常, setjmp / longjmp与C ++一起使用是不安全的。 它们有效地复制了exception的行为,但没有正确地展开堆栈(例如,它们不会为强制退出的堆栈帧上的对象运行析构函数)。 在可能的情况下,如果您已经获得exception,请使用exception。

    好吧,对,不对。 longjmp一般不会调用析构函数,所以在如下代码中使用它:

     void f(jmp_buf jb) { some_cpp_object_with_a_nontrivial_destructor x; if (some_condition) longjmp(jb, 2); // some other code } 

    会发生各种不好的事情。 如果你避免这种情况,你应该没问题。 (通常,longjmp不得跳过具有非平凡析构函数的对象的任何活动堆栈帧。)

      以上就是c/c++开发分享链接到C ++库时在C中使用setjmp和longjmp相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/545607.html

      (0)
      上一篇 2021年1月10日
      下一篇 2021年1月10日

      精彩推荐