Вот подробности того, что происходит со стандартом C ++ 03.
Так вот почему ваш foos
объект не разрушается (у него статическая продолжительность хранения). Однако, даже если вы измените его так, чтобы это была локальная переменная (с автоматической продолжительностью), это может не решить проблему (выделение добавлено):
Таким образом, для static duration
объектов деструкторы не вызываются, если вы не измените обработчик завершения (возможно, чтобы он вызывал exit()
вместо abort()
). Однако для автоматических объектов остается возможная проблема (выделение добавлено):
15.5.1 / 1 Функция terminate()
В случае, когда не найден соответствующий обработчик, он
определяется реализацией вне зависимости от того, будет ли стек разматываться раньше
терминат () вызывается. Во всех других ситуациях стек не должен
быть размотанным до вызова метода terminate ().