С++: безопасно использовать 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.