id operator delete(void* p) {

Автор admin Воскресенье, 3 мая 2009 11:32

id operator delete(void* p) { 38 Глава 1 • Обработка исключений cout « “deallocating a Dog” « endl; ::operator delete(p): } }: class UseResources { Cat* bp: Dog* op; public: UseResources(int count = 1) { cout « “UseResources()” « endl; bp = new Cat[count]: op = new Dog: } -UseResourcesО { cout « “-UseResources()” « endl: delete [] bp; // Уничтожение массива delete op; } }: int mainO { try { UseResources ur(3); } catch(int) { cout « “inside handler” « endl; } } ///:-Результат: UseResourcesO CatO CatO CatO allocating a Dog inside handler Программа входит в конструктор UseResources, и конструктор Cat успешно завершается для трех объектов массива. Однако при вызове Dog::operator new происходит исключение (имитация нехватки памяти). Внезапно управление передается в обработчик без вызова деструктора UseResources — и это логично, потому что конструктор UseResources не завершился. Но это также означает, что объекты Cat, успешно созданные в куче, тоже не будут уничтожены. Управление ресурсами на уровне объектов Чтобы предотвратить подобную утечку ресурсов, необходимо отказаться от «низкоуровневого» выделения р


Комментарии закрыты.