Использование setjmp и longjmp в C при связывании с библиотеками C ++ - PullRequest
6 голосов
/ 31 августа 2011

Я хотел бы использовать setjmp и longjmp в программе на C, которая ссылается на библиотеку, которая реализована на C ++ (но имеет C API).

Код C ++ выполняет динамическое выделение памяти, а указатели передаются через API, но до тех пор, пока сторона C кода правильно управляет этими (непрозрачными) объектами, не должно быть никаких проблем при использовании longjmp, верно

Я знаю, что использовать эти функции в коде C ++ небезопасно, но должно ли это быть безопасно в коде C, связанном с кодом C ++?

Ответы [ 3 ]

4 голосов
/ 31 августа 2011

Тот факт, что вы вызываете функции C ++ из своего кода C, не делает setjmp и longjmp более небезопасными, чем они всегда являются.

Важно то, что если ваша библиотека выделяет ресурсы, у вас должен быть код восстановления, чтобы обеспечить их правильное освобождение после вызова longjmp. Хотя это, вероятно, легко для ваших собственных распределений, это может быть трудно или невозможно для библиотеки C ++ в зависимости от того, как структурирован интерфейс C, который вы используете.

2 голосов
/ 31 августа 2011

setjmp / longjmp, как правило, не безопасны для использования с C ++.Они эффективно копируют поведение исключений, но без правильного разматывания стека (например, они не будут запускать деструкторы для объектов в кадрах стека, которые они принудительно выходят).Если возможно, используйте исключения, если они у вас есть.

1 голос
/ 31 августа 2011

Ну правильно и не правильно. longjmp обычно не вызывает деструкторы, поэтому используйте его в коде, подобном следующему:

void f(jmp_buf jb)
{
  some_cpp_object_with_a_nontrivial_destructor x;
  if (some_condition) longjmp(jb, 2);
  // some other code
}

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

...