Исключения будут вызывать деструкторы, если что-то в программе перехватывает исключение. Если исключение выходит из функции main () без перехвата, стандарт не требует, чтобы среда выполнения развернула стек для очистки.
Использование
try{
// code
}catch(...){ //that elipsis should actually appear in your code
//it doesn't mean I omitted code here.
//code
}
в вашей функции main()
гарантирует, что каждое исключение будет перехвачено, и все деструкторы будут вызваны.