C++: безопасно использовать longjmp и setjmp?
Безопасно ли использовать longjmp и setjmp в C++ на linux/gcc в отношении следующего?
- Обработка исключений (я не реализую обработку исключений с использованием longjmp/setjmp. Я хочу знать, какие побочные эффекты окажет longjmp / setjmp при стандартной обработке исключений)
*this
указатель- сигналы
- Умные указатели (общие и навязчивые указатели boost)
- Все, что вы можете придумать.
2 ответа
setjmp()
/ longjmp()
полностью разрушить раскрутку стека и, следовательно, обработку исключений, а также RAII (деструкторы в целом).
От 18.7/4 "Другая поддержка времени выполнения" в стандарте:
Если какие-либо автоматические объекты будут уничтожены вызванным исключением, передающим управление в другую (целевую) точку в программе, то вызов
longjmp(jbuf, val)
в точке выброса, которая передает управление в ту же (целевую) точку, поведение не определено.
Таким образом, суть в том, что setjmp()
/ longjmp()
не хорошо играть в C++.
Это не специфично для Linux или gcc; setjmp / longjmp и C++ не слишком хорошо работают вместе, если вы используете longjmp для выхода из контекста, где есть автоматические переменные с деструкторами.
Деструкторы не будут работать, что может привести к утечке памяти или другому плохому поведению.
Я только узнал об этих командах и никогда не видел их в действии в реальных приложениях.
ИМХО, можно с уверенностью сказать, что их использование небезопасно: разработчики не поймут, что делают эти "непопулярные" API.