Возможный дубликат:
Предотвратит ли exit() или исключение вызов деструктора конца области видимости?
В C++, когда приложение вызывает exit(3), должны ли запускаться деструкторы стека для раскручивания стека?
Возможный дубликат:
Предотвратит ли exit() или исключение вызов деструктора конца области видимости?
В C++, когда приложение вызывает exit(3), должны ли запускаться деструкторы стека для раскручивания стека?
Нет, большинство деструкторов не запускаются на exit()
.
C++98 §18.3/8 обсуждает это.
По сути, при вызове exit
статические объекты уничтожаются, обработчики atexit
выполняются, открытые потоки C сбрасываются и закрываются, а файлы, созданные tmpfile
, удаляются. Локальные автоматические объекты не уничтожаются. То есть без раскручивания стека.
Вызов abort
позволяет сделать еще меньше: никакой очистки.
Если ваша ОС является разумной (Unix, Linux или недавняя Windows), вызов функции exit() сообщает ядру о необходимости отменить выделение памяти для всех процессов. Стек не нужно разматывать; он просто перестанет существовать.
throw
особый тип вместо вызоваexit
ловить его вmain
, а потомreturn
изmain
вместоexit
изmain
? - person Aaron McDaid   schedule 11.06.2016exit()
? В одном из моих приложений я выбрасываю объектcustomExit
и перехватываю его в main и использую целочисленное значение из объектаcustomExit
для предоставления возвращаемого значения из main, таким образом мои деструкторы RAII запускаются для очистки таких вещей, как временные файлы. - person WilliamKF   schedule 11.06.2016throw
подход, чтобы гарантировать, что все будет уничтожено при обычном выходе из программы. - person Aaron McDaid   schedule 11.06.2016