Как я уже сказал в моих комментариях, ситуации, о которых говорится в стандарте, являются исключительными обстоятельствами, которые не должны происходить.Очень велики шансы, что если они произойдут, ваша программа больше не будет работать должным образом.Таким образом, оно прекращено, и стандарт не гарантирует, что все деструкторы будут вызваны правильно.
Решение состоит в том, чтобы предотвратить возникновение обстоятельств.
аварийный выход (путем вызова std ::abort или std :: exit ())
Не звоните abort
или exit
.Пусть все вызываемые функции возвращаются и позволяют main
делать return
.
или когда исключение распространяется из первичной функции потока
Перехватывать все исключения в main
.Тогда return
.Или, если глобальных объектов нет, вы также можете abort
.
или когда объявленный метод noexcept выдает исключение ".
Не добавляйте noexcept
functions.
Проблемы, которые могут возникнуть, связаны не только с памятью. Интеллектуальный указатель, удаляющий удерживаемый указатель, запускает деструктор объекта, на который он указывает. Объект может содержать внешние ресурсы.например, файл (или сокет), который должен быть сброшен (записывая буферизованный ввод / вывод) перед его закрытием.Это также может быть аппаратное обеспечение низкого уровня, такое как GPIO, которое, например, включает свет во время операции и включаетэто в деструкторе.