Код деструктора для класса 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 выйдет за пределы области видимости. Более редкий сбор мусора, как правило, эффективнее. Выбранная в книге частота сбора мусора объясняется необходимостью иллюстрации этой операции.
|