在C中链接到c++库时使用setjmp和longjmp
Use of setjmp and longjmp in C when linking to C++ libraries
我想在一个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不能跳过任何活动堆栈帧。)
相关文章:
- [longjmp/setjmp]c++ 相同的代码窗口有异常 Linux 没有错误并且运行良好
- 为什么 setjmp/longjmp 的这种用法是未定义的行为?
- longjmp应该还原堆栈吗
- setjmp/longjmp 在发布和调试中的不同行为
- 运行时特性测试、setjmp、longjmp和信号掩码
- C++ 和 C 库使用 longjmp
- 为什么这个setjmp程序要打印一个5
- 不一致的警告:变量可能会被“longjmp”或“vfork”破坏
- Lua协程——setjmp跳远
- 通过尝试块进行 longjmp 是否安全
- setjmp和longjump来实现线程
- 为什么 setjmp 在包含 时不在 std 命名空间中?<csetjmp>
- 是在setjmp被销毁之前创建的对象
- 当使用setjmp和longjmp时,Valgrind会失败
- 在Arduino IDE中使用正则表达式库时对"longjmp"的未定义引用
- 为什么 setjmp 不保存堆栈?
- 在C中链接到c++库时使用setjmp和longjmp
- c++异常和setjmp/longjmp的代价
- 在C++中使用set_jmp/longjmp不起作用