Использование 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 не должен перепрыгивать через любые активные кадры стека с объектами, имеющими нетривиальные деструкторы.)

Другие вопросы по тегам