链接到C ++库时在C中使用setjmp和longjmp

时间:2011-08-31 04:07:57

标签: c++ c longjmp setjmp

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

一般来说,

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

答案 2 :(得分:1)

嗯,对,不对。 longjmp通常不会调用析构函数,因此请在如下代码中使用它:

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

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