首页 > 解决方案 > 在 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进行清理。tryfinallyusing

在 C 中,如果library_function_1使用setjmpand library_function_2 longjmps 回到它,有什么办法my_function可以清理吗?

标签: cresource-cleanupsetjmp

解决方案


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

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


推荐阅读