(

LocalGuy MyLocalGuy;

cout « " В конструкторе Derived.\n";

if (flag)

throw -1;

}

-Derived() { cout « " В деструкторе Derived.\n"; } };

void main() {

try {

Derived(1) ;

) catch (int) (

cout « "Перехвачена исключительная ситуация класса Derived.\n";

)

}

При выполнении программа выводит на экран следующее:

В конструкторе Base.

В конструкторе LocalGuy.

В конструкторе Derived.

В деструкторе LocalGuy.

В деструкторе Base.

Перехвачена исключительная ситуация класса Derived.

Вы видите, что программа успешно строит класс Base (вспомните, что конструкторы вызываются в порядке от Base к Derived). Затем управление передается конструктору Derived, который генерирует исключительную ситуацию. Программа удаляет объект класса Base и направляет исключительную ситуацию соответствующему обработчику. Экземпляр класса LocalGuy подтверждает, что локальные объекты должным образом уничтожаются.

Заметьте, что программа не вызывает деструктор для Derived, что исполнено глубокого смысла. Так как создание объекта Derived не закончено, неуместно вызвать деструктор, назначение которого состоит в удалении полностью сконструированного объекта. Однако в равной степени важно заметить, что к тому времени, когда начинается выполнение конструктора Derived, часть экземпляра Derived, унаследованная от Base — своего рода "подобъект" — полностью построена, поэтому деструктор вазе вызывается обязательно.

Наконец, запомните, что динамически выделенные ресурсы не освобождаются автоматически при генерации исключительных ситуаций. Если конструктор выделяет память из кучи с помощью операции new и вы хотите генерировать исключительную ситуацию внутри конструктора, следует освободить выделенную память еще до передачи исключительной ситуации. Если

20 Зак.ЗОв