Главная arrow С++ (часть 4) arrow Деструктор класса GCPtr

Деструктор класса GCPtr

Код деструктора для класса GCPtr приведен далее. // Деструктор класса GCPtr. template <class Т, int size> GCPtr<T,  size>::-GCPtr()   {
list<GCInfo<T> >::iterator p;
p = findPtrInfo(addr);
if(p->refcount) p->refcount—; // уменьшает на единицу счетчик ссылок
#ifdef DISPLAY
cout « "GCPtr going out of scope.\n"; #endif
// Собирает мусор, когда указатель выходит за пределы области // видимости, collect();
//На практике вы можете собирать неиспользуемую память // реже, к примеру, когда gclist достигнет
// определенного размера или после того как определенное число // указателей GCPtr выйдет за пределы области видимости // или доступная память иссякнет.
}
Сбор мусора проводится каждый раз, когда объект типа GCPtr выходит за пределы области видимости. Эта операция выполняется деструктором -GCPtrо. Сначала просматривается список gclist для поиска адреса, на который указывает удаляемый объект типа GCPtr. Если он найден, то его поле ref count уменьшается на единицу. Далее деструктор -GCPtr () вызывает функцию collect о для очистки любой неиспользуемой памяти (тех фрагментов, счетчики ссылок которых равны нулю).
Как утверждается в комментарии, размещенном в конце кода деструктора, для практических целей рекомендуется собирать мусор гораздо реже, чем в тестовой программе, выполняющей эту операцию, как только какой-либо объект типа GCPtr выйдет за пределы области видимости. Более редкий сбор мусора, как правило, эффективнее. Выбранная в книге частота сбора мусора объясняется необходимостью иллюстрации этой операции.