В зависимости от того, что вы подразумеваете под «внезапным завершением», существует несколько различных вариантов:
- Глобальные деструкторы будут вызываться при нормальном завершении (возврат из
main
иливызов exit()
). atexit()
регистрирует функцию, вызываемую при нормальном завершении. std::set_terminate
регистрирует функциюэто будет вызвано, когда исключение выдается, но не перехвачено, или когда «обработка исключения должна быть прервана по какой-либо другой причине». sigaction()
регистрирует функции, которые вызываются, когда вашПрограмма получает сигналы , многие из которых обычно внезапно завершают вашу программу.Обработчики сигналов могут вызываться, когда программа находится во внутренне несовместимом состоянии, и поэтому крайне ограничены в своих возможностях.Например, они не могут делать ничего, что могло бы выделить память.Кроме того, этот API недоступен в Windows;есть эквиваленты, но я не знаком с ними.
Обратите внимание, что все широко используемые операционные системы предоставляют по крайней мере один способ внезапного завершения вашей программы, который не может быть перехвачен из вашей программы.код.Например, Unix имеет сигнал 9 (SIGKILL
), для которого вы не можете зарегистрировать обработчик. Это функция, а не ошибка. Вам, пользователю, нужен способ заставить процесс уйти, даже если он сделал все, что в его силах, чтобы сделать себя неуничтожимым.Кроме того, никакой код не может защитить ваш процесс, когда домашний кролик пользователя грызет шнур питания компьютера.Из-за этого может быть лучше использовать ваше время, чтобы спроектировать программу для восстановления после сбоев , а не пытаться выполнить очистку при возникновении сбоя.Подробнее об этом см. В этой статье « Конструкция только для сбоя ».