链接到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不得跳过具有非平凡析构函数的对象的任何活动堆栈帧。)