C++: безопасно использовать longjmp и setjmp?

Безопасно ли использовать longjmp и setjmp в C++ на linux/gcc в отношении следующего?

  1. Обработка исключений (я не реализую обработку исключений с использованием longjmp/setjmp. Я хочу знать, какие побочные эффекты окажет longjmp / setjmp при стандартной обработке исключений)
  2. *this указатель
  3. сигналы
  4. Умные указатели (общие и навязчивые указатели boost)
  5. Все, что вы можете придумать.

2 ответа

Решение

setjmp() / longjmp() полностью разрушить раскрутку стека и, следовательно, обработку исключений, а также RAII (деструкторы в целом).

От 18.7/4 "Другая поддержка времени выполнения" в стандарте:

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

Таким образом, суть в том, что setjmp() / longjmp() не хорошо играть в C++.

Это не специфично для Linux или gcc; setjmp / longjmp и C++ не слишком хорошо работают вместе, если вы используете longjmp для выхода из контекста, где есть автоматические переменные с деструкторами.

Деструкторы не будут работать, что может привести к утечке памяти или другому плохому поведению.

Я только узнал об этих командах и никогда не видел их в действии в реальных приложениях.

ИМХО, можно с уверенностью сказать, что их использование небезопасно: разработчики не поймут, что делают эти "непопулярные" API.

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