История изменений
Исправление hatred, (текущая версия) :
А ещё кто-то переопределит std::terminate_handler
и ничего не завершится).
По умолчанию, хендлер - std::abort()
aka просто abort()
, который в случае юниксов вынудит ядро послать процессу SIGABRT
.
По поводу exit()
. Не хочешь звать exit()
… вызови std::exit()
:-D
Если коротко, то вызовутся деструкторы для всех объектов со статическим времени жизни, которые были созданы: std::exit().
Деструкторы объектов с динамическим временем жизни (грубо: созданными через new
) вызваны не будут. Но ты можешь зарегистрировать функцию очтистки через std::atexit().
Сложнее с объектами, со автоматическим временем жизни, т.е. обычными объектами, созданными на стеке: у нас не будет выхода за пределы области видимости (возврата из функции std::exit()
нет), а значит и условие вызова деструктора не выполняется.
С тредами тоже нюанс: если дойдёт дело до деструктора std::thread
, а тред в работе, то вылетит исключение и тогда уже будет или обработка оного с твоей стороны или std::terminate()
.
И всё выше верно для всех вариантов выхода, минуя выход через return
из main()
. Отсюда и варианты:
- коды ошибок и возвращаться наверх в
main()
и там делатьreturn
. - вместо
exit()
- бросать исключение и ловить его на самом верху (в треде - в функции треда), при исключении стек раскручивается и деструкторы гарантированно вызываются
Это про решения в лоб, а дальше задаться вопросом:
А что будет если у автоматического объекта не вызовется деструктор?
- Если открыт файл - его закроет файловая система
- Аналогично с сокетом
- Память тоже после смерти процесса система вернёт
Если же есть какие-то чувствительные данные (затереть ключи и пароли в памяти перед выходом, SHM почистить/освободить, всякие gpio с state-full реализацией (через /sys) вернуть в нужное состояние, etc), которые нужно гарантированно чистить, то тут однозначно нужен хендлер через std::atexit()
или через RAII объект со статическим временем жизни.
С тредами тоже: нужно сигналить и завершаться. А может и не нужно, и просто быстро выходить. Всё зависит от твоих данных.
В общем, как видно - безопасности, далеко не всегда про скорость :)
Исходная версия hatred, :
А ещё кто-то переопределит std::terminate_handler
и ничего не завершится).
По умолчанию, хендлер - std::abort()
aka просто abort()
, который в случае юниксов вынудит ядро послать процессу SIGABRT
.
По поводу exit()
. Не хочешь звать exit()
… вызови std::exit()
:-D
Если коротко, то вызовутся деструкторы для всех объектов со статическим времени жизни, которые были созданы: std::exit().
Деструкторы объектов с динамическим временем жизни (грубо: созданными через new
) вызваны не будут. Но ты можешь зарегистрировать функцию очтистки через std::atexit().
Сложнее с объектами, со автоматическим временем жизни, т.е. обычными объектами, созданными на стеке: у нас не будет выхода за пределы области видимости (возврата из функции std::exit()
нет), а значит и условие вызова деструктора не выполняется.
С тредами тоже нюанс: если дойдёт дело до деструктора std::thread
, а тред в работе, то вылетит исключение и тогда уже будет или обработка оного с твоей стороны или std::terminate()
.
И всё выше верно для всех вариантов выхода, минуя выход через return
из main()
. Отсюда и варианты:
- коды ошибок и возвращаться наверх в
main()
и там делатьreturn
. - вместо
exit()
- бросать исключение и ловить его на самом верху (в треде - в функции треда), при исключении стек раскручивается и деструкторы гарантированно вызываются
Это про решения в лоб, а дальше задаться вопросом:
А что будет если у автоматического объекта не вызовется деструктор?
- Если открыт файл - его закроет файловая система
- Аналогично с сокетом
- Память тоже после смерти процесса система вернёт
Если же есть какие-то чувствительные данные (затереть ключи и пароли в памяти перед выходом), которые нужно гарантированно чистить, то тут однозначно нужен хендлер через std::atexit()
или через RAII объект со статическим временем жизни.
С тредами тоже: нужно сигналить и завершаться. А может и не нужно, и просто быстро выходить. Всё зависит от твоих данных.
В общем, как видно - безопасности, далеко не всегда про скорость :)