c - 在 C 中,如果 longjmp “通过”我的函数,有什么方法可以清理吗?
问题描述
我有以下调用堆栈:
library_function_1 ====> my_function ====> library_function_2
calls calls
在 C++ 中,如果library_function_2
抛出异常并library_function_1
捕获它,my_function
可以使用析构函数(即 RAII)安全地清理(释放资源等)。
在 C# 中,类似地,可以使用/和语句my_function
进行清理。try
finally
using
在 C 中,如果library_function_1
使用setjmp
and library_function_2
longjmp
s 回到它,有什么办法my_function
可以清理吗?
解决方案
做到这一点的唯一方法是,如果setjmp()
从函数传递信息library_function_1
是通过您的函数(或者您可以访问它)进行的,您可以保存从中获得的信息,然后setjmp()
在您的函数代码中执行另一个操作,然后将其传递to library_function_2
...在这种情况下,您正在拦截调用嵌套并setjmp()
返回...内部函数将返回给您,因为它是从 up 收到的...然后您必须longjmp()
对你收到的地方library_function_1
。
但是,如果您无法访问该信息,则无法拦截它。
推荐阅读
- android - Scaffold Messenger 的问题:在 null 上调用了“showSnackBar”方法
- kubernetes-helm - 无法在 kubernetes 上的服务监视器 yaml 中使用正则表达式删除普罗米修斯中的指标
- java - 如何将片段edittext数据发送到片段中没有按钮的活动
- python - 使用python自动从网站下载aspx文件
- excel - Excel:表格单元格在多行数据后似乎有空格
- kubernetes-helm - 如何保存由 helm chart 模板生成的 yaml?
- android - 无法构建铬 android
- visual-studio-code - Unknown Error: Jupyter extension cannot select interpreter
- firebase - How to manage upload/deletion of multiple images in flutter and keeping it in sync between firestore, cloud-storage and UI
- ruby-on-rails - Issues with Trix editor in Rails