При запуске этого кода я получаю вывод
constructor called
exception handler
destructor called
Что имеет смысл. Конструктор для статического объекта test
вызывается первым. Когда выдается исключение, оно перехватывается обработчиком исключения и печатается сообщение. Наконец, когда программа завершается, вызывается деструктор для статического объекта test
.
Исключения только заканчивают время жизни переменных с автоматической продолжительностью (т.е. локальных), предполагая, что исключение действительно где-то поймано. Исключения не будут уничтожать объекты с динамической длительностью (то есть вещи, выделенные с new
), хотя, если в конструкторе возникает исключение для динамически размещаемого объекта, память будет возвращена, поскольку в противном случае нет способа вернуть память обратно. Точно так же static
объекты не уничтожаются, так как они должны длиться всю программу. Если они были очищены, это может вызвать проблемы, если ссылки на эти объекты были переданы вокруг программы.
Надеюсь, это поможет!