我想在一个 C 程序中使用 setjmp 和 longjmp,该程序链接到一个用 C++ 实现的库(但有一个 C API)。
C++ 代码确实进行动态内存分配,并且指针通过 API 传递,但只要代码的 C 端正确管理这些(不透明)对象,使用 longjmp 时不应该有任何混乱,对吧?
我知道在 C++ 代码中使用这些函数是不安全的,但是在链接到 C++ 代码的 C 代码中应该是安全的吗?
您从 C 代码中调用 C++ 函数这一事实不会使 setjmp 和 longjmp 比以往更加不安全。
重要的是,如果您的库分配资源,则必须有恢复代码以确保在调用 longjmp 后正确释放这些资源。虽然这对于您自己的分配可能很容易,但对于 C++ 库来说可能很难或不可能,具体取决于您使用的 C 接口的结构。
setjmp
/longjmp
通常,与 C++ 一起使用是不安全的。它们有效地复制了异常的行为,但没有正确展开堆栈(例如,它们不会为强制退出的堆栈帧上的对象运行析构函数)。在可能的情况下,如果您有例外,请使用例外。
好吧,对与不对。longjmp
通常不会调用析构函数,因此在如下代码中使用它:
void f(jmp_buf jb)
{
some_cpp_object_with_a_nontrivial_destructor x;
if (some_condition) longjmp(jb, 2);
// some other code
}
会让各种不好的事情发生。如果你避免这种情况,你应该没问题。(一般来说,longjmp 不能跳过任何具有非平凡析构函数的对象的活动堆栈帧。)