В C, есть ли способ очистить, если longjmp «проходит» через мою функцию? - PullRequest
4 голосов
/ 11 июля 2019

У меня есть следующий стек вызовов:

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

В C ++, если library_function_2 выдает исключение и library_function_1 перехватывает его, my_function может безопасно очистить (освободить ресурсы и т. Д.), Используядеструкторы (т. е. RAII).

Аналогично, my_function можно очистить, используя операторы try / finally и using.

В C, если library_function_1использует setjmp и library_function_2 longjmp s обратно, есть ли способ для my_function убрать?

1 Ответ

0 голосов
/ 12 июля 2019

Единственный способ сделать это, если передача setjmp() информации из функции library_function_1 осуществляется через вашу функцию (или у вас есть к ней доступ), вы можете сохранить информацию, полученную из нее, и сделатьеще один setjmp() в код вашей функции и передача его в library_function_2 ... в этом случае вы перехватываете вложение вызова и setjmp() возвращает ... внутренняя функция вернется к вам, потому что это то, чтоон получил от ... и тогда вам нужно будет сделать longjmp() с местом, которое вы получили от library_function_1.

Но если эта информация вам недоступна, перехватить невозможноэто.

...