C++ 11 представляет новый способ завершения выполнения программы - std::quick_exit
.В чем разница между std :: quick_exit и std :: abort и почему нужен std :: quick_exit?
Цитируя N3242 18.5 (стр 461).:
[[noreturn]] void quick_exit(int status) noexcept;
эффекты: Функции, зарегистрированные вызовами
at_quick_exit
называются в обратном порядке их регистрации, за исключением того, что функция наречется после того, как ранее зарегистрированные функции, которые имели , уже были вызваны во время регистрации. Объекты не должны быть уничтожены в результате вызова . Если элемент управления оставляет зарегистрированную функцию, вызваннуюquick_exit
, потому что функция не предоставляет обработчик для исключенного броска,terminate()
. [Примечание:at_quick_exit
может вызывать зарегистрированную функцию из другого потока , кроме зарегистрированного, поэтому зарегистрированные функции должны не полагаться на идентификатор объектов с продолжительностью хранения потоков. - конец примечания] После вызова зарегистрированных функцийquick_exit
должен позвонить_Exit(status)
. [Примечание: стандартные буферы файлов не очищаются. См .: ISO C 7.20.4.4. - конец примечание]
Поскольку определение std::abort(void)
и std::_Exit(int status)
отличается только способностью передавать статус родительского процесса, это поднимает мой вопрос.
Означает ли это, что единственное различие в семантике между std::quick_exit
и std::abort
том, что std::quick_exit
вызовы функции регистрируются с помощью std::at_quick_exit
и позволяет установить возвращаемый статус?
Каково было обоснование для введения этой функции?
Кроме того, поскольку 'abort' сигнализирует' SIGABRT', вызов 'abort' будет обычно приводить (хотя это настраивается) в * * core dump ** on * nix или во всплывающем окне Windows (например, _Program перестала работать, Close/Debug_). Используйте только «abort» при завершении из-за ** неожиданного условия **, и вы хотите, чтобы coredump/minidump ** диагностировать причину ** для неожиданного состояния. – vladr