Использование setjmp и longjmp в C при связывании с библиотеками C++
Я хотел бы использовать setjmp и longjmp в программе на C, которая ссылается на библиотеку, которая реализована на C++ (но имеет C API).
Код C++ выполняет динамическое распределение памяти, а указатели передаются через API, но до тех пор, пока сторона C кода правильно управляет этими (непрозрачными) объектами, при использовании longjmp не должно быть никаких проблем, верно?
Я знаю, что использовать эти функции в коде C++ небезопасно, но должно ли быть безопасно в коде C, связанном с кодом C++?
3 ответа
Тот факт, что вы вызываете функции 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 не должен перепрыгивать через любые активные кадры стека с объектами, имеющими нетривиальные деструкторы.)