Есть ли безопасный способ использовать setjmp () и longjmp () в C ++? - PullRequest
4 голосов
/ 09 августа 2010

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

Существуют ли переносимые средства обеспечения правильности программы при использовании setjmp() и longjmp() в C ++? Лучшие практики в C ++ указывают, что исключения лучше всего не использовать для управления потоком, но в ситуации, которая требует крайне необычного потока (например, сопрограммы и замыкания), всегда ли предпочтительнее использовать исключения вместо этих функций?

Ответы [ 2 ]

2 голосов
/ 09 августа 2010

Если у вас есть какое-то странное требование, которое не позволяет вам нормально управлять потоком программы, с помощью условных выражений / циклов / разрывов, я бы предпочел использовать исключение над jmp.

Существуют сценарии, в которых допустимо использование исключения для управления потоком. Я думаю, что одна из функций поиска Boost.Graph выдает исключение для быстрого возврата вызывающей стороне из глубокой рекурсии.

1 голос
/ 09 августа 2010

Я использовал их раньше, но только при одном обстоятельстве: я создавал ядро ​​ОС на С для класса ОС; они использовались для обработки исключений.

Насколько я понимаю, они используются для обработки исключений при работе с низкоуровневым кодом, например в операционной системе. Для общего программного обеспечения C ++ я бы просто использовал try catch.

...