Блок Try / Catch заменен блоком метода в деструкторе

Мне недавно было поручено найти утечку памяти в части нашего кода. Утечка оказалась в деструкторе определенного объекта ... и я обнаружил кое-что действительно странное. Бывший коллега написал это:

File::~File()
try
{
    Clear();
}
catch (...)
{
    Log("caught exception");
}

Класс файла наследуется от некоторых базовых классов. Мой первый вопрос: это строго законный C ++? Он компилируется в Visual Studio 2008, но я показал его нескольким друзьям / коллегам, и они были в ужасе от того, что это сработало.

На самом деле это не работает так, как предполагалось: базовый класс, от которого наследуется этот объект, имеет деструктор, который теперь никогда не вызывается (в отличие от того, если вы просто заключили деструктор в обычный блок метода, имея команду try / catch как часть этого метода).

Может ли кто-нибудь попытаться объяснить, почему это разрешено и почему не был вызван деструктор базового класса? Деструктор здесь не бросал.

6
задан phyllis diller 10 May 2011 в 15:50
поделиться