Мне недавно было поручено найти утечку памяти в части нашего кода. Утечка оказалась в деструкторе определенного объекта ... и я обнаружил кое-что действительно странное. Бывший коллега написал это:
File::~File()
try
{
Clear();
}
catch (...)
{
Log("caught exception");
}
Класс файла наследуется от некоторых базовых классов. Мой первый вопрос: это строго законный C ++? Он компилируется в Visual Studio 2008, но я показал его нескольким друзьям / коллегам, и они были в ужасе от того, что это сработало.
На самом деле это не работает так, как предполагалось: базовый класс, от которого наследуется этот объект, имеет деструктор, который теперь никогда не вызывается (в отличие от того, если вы просто заключили деструктор в обычный блок метода, имея команду try / catch как часть этого метода).
Может ли кто-нибудь попытаться объяснить, почему это разрешено и почему не был вызван деструктор базового класса? Деструктор здесь не бросал.