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

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

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

Ответ 1

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

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

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

Итак, нижняя строка заключается в том, что setjmp()/longjmp() не очень хорошо воспроизводятся на С++.

Ответ 2

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

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

Ответ 3

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

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