Если это после возврата main()
, то в соответствии со Стандартом все деструкторы были запущены (хотя я бы не стал отказываться от реализации, чтобы выдумать это), если только не была использована функция atexit()
. Эта функция регистрирует функцию, которая будет вызываться после возврата main()
, эффективно (если я правильно читаю 3.6.3). Вы можете проверить, есть ли в вашей программе atexit
где-нибудь, хотя бы для полноты.
В зависимости от того, что вы подразумеваете под «после возвращения основной части», вы можете запускать деструкторы для статических объектов при сбое программы. Проверьте это. (Кроме того, опубликуйте то, что вы заметили, что заставило вас думать, что это произошло после того, как main()
вернулся. Вы можете ошибаться там.)
Если нет, то вы вызывали неопределенное поведение где-то, очень вероятно, что каким-то образом повредили стек. См. Ответ Рупа для предложений там.