Деструкторы локальных объектов вызываются при раскрутке стека во время обработки исключения. Однако есть ситуации, когда деструктор не вызван:
std::abort() или std::terminate(). Эти функции завершают программу немедленно, без обычной процедуры очистки и раскрутки стека.catch) или во время раскрутки стека при обработке первого исключения возникает второе исключение (std::uncaught_exceptions() > 0), стандартная библиотека вызывает std::terminate(), что приводит к немедленному завершению программы без вызова деструкторов для объектов, которые еще не были уничтожены.new) и управляемых умными указателями или ручным delete. Если объект выделен динамически и не управляется, а исключение происходит до явного delete, деструктор не вызывается.std::exit(). Эта функция завершает программу, вызывая зарегистрированные функции atexit, но не вызывает деструкторы для локальных автоматических объектов.c