Запускаются ли деструкторы при вызове exit()?

Возможный дубликат:
Предотвратит ли exit() или исключение вызов деструктора конца области видимости?

В C++, когда приложение вызывает exit(3), должны ли запускаться деструкторы стека для раскручивания стека?


person WilliamKF    schedule 14.08.2011    source источник
comment
И есть ли альтернативный подход? throw особый тип вместо вызова exit ловить его в main, а потом return из main вместо exit из main?   -  person Aaron McDaid    schedule 11.06.2016
comment
@AaronMcDaid Я не понимаю твоего вопроса. Альтернативный подход к чему? Чего бы вы хотели добиться, избегая вызова exit()? В одном из моих приложений я выбрасываю объект customExit и перехватываю его в main и использую целочисленное значение из объекта customExit для предоставления возвращаемого значения из main, таким образом мои деструкторы RAII запускаются для очистки таких вещей, как временные файлы.   -  person WilliamKF    schedule 11.06.2016
comment
ваш комментарий точно ответил на мой (плохо написанный) вопрос. Спасибо! По сути, я хотел подтвердить, что другие люди используют этот throw подход, чтобы гарантировать, что все будет уничтожено при обычном выходе из программы.   -  person Aaron McDaid    schedule 11.06.2016


Ответы (2)


Нет, большинство деструкторов не запускаются на exit().

C++98 §18.3/8 обсуждает это.

По сути, при вызове exit статические объекты уничтожаются, обработчики atexit выполняются, открытые потоки C сбрасываются и закрываются, а файлы, созданные tmpfile, удаляются. Локальные автоматические объекты не уничтожаются. То есть без раскручивания стека.

Вызов abort позволяет сделать еще меньше: никакой очистки.

person Cheers and hth. - Alf    schedule 14.08.2011
comment
Для людей, которые не хотят, чтобы очистка происходила, _exit() может быть лучшим вызовом, чем abort(), поскольку abort вызывает сигнал SIGABRT, что обычно приводит к поведению, очень похожему на сбой. - person Jeremy Friesner; 01.11.2016

Если ваша ОС является разумной (Unix, Linux или недавняя Windows), вызов функции exit() сообщает ядру о необходимости отменить выделение памяти для всех процессов. Стек не нужно разматывать; он просто перестанет существовать.

person Barry Brown    schedule 14.08.2011
comment
И любой код RAII в деструкторах стека НЕ ​​будет вызываться. Что может не иметь значения, если речь идет только о памяти, приватной для процесса; но что имеет значение, если он имеет дело с (а) файлами, которые необходимо удалить или переименовать или иным образом очистить, и (б) целостностью структур данных, совместно используемых процессами в общей памяти. // По таким причинам в некоторых проектах запрещено использование выхода и/или переопределен метод exit() для выдачи исключения, вызывающего раскручивание стека. - person Krazy Glew; 13.07.2012