Программирование >>  Формирование пользовательского контейнера 

1 ... 8 9 10 [ 11 ] 12 13 14 ... 156


return rv;

Функция-утилита для отображения списка gclist. tenplate <class Т, int size> void GCPtr<T, size>;:ShowlistO { list<GCInfo<T> >::iterator p;

cout gclist< typeid(T) .nameO ?:< ,

if(p != gclist.endO)

p->refcount++; else {

Создает и запоминает новый элемент. GCInfo<T> gcObj(t, size); gclist.push front(gcObj);

>

addr = t; запоминает адрес, return t;

Перегружает присваивание одного GCPtr другому GCPtr. tenplate <class T, int size>

GCPtr<T, size> & GCPtr<T, size>::operator=(GCPtr &rv) { list<GCInfo<T> >::iterator p;

Сначала уменьшает на единицу счетчик ссылок для памяти, указываемой в данный момент, р = findPtrlnfo(addr); p->refcount-;

Далее увеличивает счетчик ссылок для

нового адреса,

р = findPtrlnfo(rv.addr) ,-

p->refcount++; увеличивает счетчик ссылок addr = rv.addr; запоминает адрес.



size >:\п ;

cout memPtr refcount valueXn ;

if (gclist. beginO == gclist.endO) { cout - Eirpty -\n\n ; return;

for(p = gclist.beginO ; p != gclist.endO; p++) { cout [ (void *)p->memPtr ]

p->refcount ;

if(p->memPtr) cout *p->memPtr;

else cout --- ;

cout endl;

cout endl;

Находит указатель в списке gclist. tlate <class T, int size> typename list<GCInfo<T> >::iterator GCPtr<T, size>::findPtrInfo(T *ptr) {

list<GCInfo<T> >::iterator p;

Находит ptr в gclist.

for(p = gclist.beginO; p != gclist.end(); p++) if(p->memPtr == ptr) return p;

ietum p;

Очищает gclist, когда программа завершается.

template <class T, int size>

void GCPtr<T, size>::shutdown О {

if (gclistSizeO == 0) return; список пуст



list<GCInfo<T> >::iterator p;

for(p = gclist.beginO; p != gclist.endO; P++) { Устанавливает все счетчики ссылок в ноль. p->refcount = 0;

#ifdef DISPLAY

cout Before collecting for shutdownO for typeid(T) .nameO \n ;

#endif collect(); #ifdef DISPLAY

cout After collecting for shutdownO for

typeid(T) .nameO \n ; #endif

Обзор классов сборщика мусора

Сборщик мусора использует четыре класса: GCPtr, ccmfo, iter и OutOfRangeExc. До подробного анзлиза кода полезно выяснить, какую роль играет каждый из них.

о классе GCPtr

Класс GCPtr - основа сборщика мусора, он реализует указатель, предназначенный для сбора мусора. GCPtr поддерживает список, который связывает счетчик ссылок с каждым фрагментом памяти, выделенной с помощью GCPtr. Главным образом, в этом и заключается его работа. Каждый раз, когда GCPtr указывает на фрагмент памяти, счетчик ссылок, связанный с этим фрагментом, увеличивается на единицу. Если GCPtr до этого указывал на другой участок памяти, счетчик ссылок этого фрагмента уменьшается на единицу. Таким образом, добавление указателя, ссылающегося на участок памяти, увеличивает на единицу его счетчик ссылок, а удаление указателя уменьшает счетчик ссылок. Каждый раз, когда GCPtr выходит за пределы области видимости (scope), счетчик ссылок, связанный с участком памяти, на который он в данный момент указывал, уменьшается на единицу. Когда



1 ... 8 9 10 [ 11 ] 12 13 14 ... 156

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика