c - 在 C 中,如果我的函数出现 longjmp "passes through",有什么方法可以清理吗?

标签 c resource-cleanup setjmp

我有以下调用堆栈:

library_function_1 ====> my_function ====> library_function_2
                   calls             calls

在 C++ 中,如果 library_function_2抛出异常并 library_function_1捕获它,my_function可以使用析构函数(即 RAII)安全地清理(释放资源等)。

在 C# 中,类似地,my_function可以使用 try 进行清理/finallyusing声明。

在 C 中,如果 library_function_1使用 setjmplibrary_function_2 longjmp回到它,有没有办法my_function清理?

最佳答案

唯一的方法是,如果从函数 library_function_1 传递 setjmp() 信息是通过您的函数(或者您可以访问它)您可以保存从中获得的信息,然后将另一个 setjmp() 放入您的函数代码中,并将其传递给 library_function_2...在这种情况下,您正在拦截调用嵌套和 setjmp() 返回......内部函数将返回给你,因为它是它从 up 接收到的......然后你必须做一个 longjmp() 到您从 library_function_1 接收到的位置。

但如果您无法访问该信息,则无法拦截它。

关于c - 在 C 中,如果我的函数出现 longjmp "passes through",有什么方法可以清理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56985129/

相关文章:

c++ - 如何在不知道名称的情况下访问结构体成员?

c - 如何将十进制数数组更改为十六进制数?

c - 具有路径重建渐近复杂性的 levenshtein 距离实现

c++ - 如何在同一个程序中创建多个套接字。?

dart - 可以删除对象后取消内部流订阅的模式?

c - 如何单步执行 gdb 中的 longjmp

c - 类型匹配错误 - 为什么?

c++ - 如何在 SIGSEGV 之后销毁在 main() 中创建的对象

c - alloca() 和 setjmp 的作用是什么?

c++ - 在 C++ 接口(interface)中隐藏 longjmps 到 C 代码