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

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


return Iter<T>(addr + size, addr, addr + size);

Возвращает размер gclist для этого типа GCPtr. static int gclistSizeO { return gel is t.sizeO ; }

функция-утилита для отображения gclist. static void showlistO;

Очищает gclist, когда программа завершается, static void shutdovm ();

Выделяет память для статических переменных teroplate <class Т, int size>

list<GCInfo<T> > GCPtr<T, size>:rgcliet;

teroplate <class T, int size> bool GCPtr<T, size>::first = true;

Деструктор для GCPtr. teroplate <class T, int size> GCPtr<T, size>::-GCPtr 0 { list<GCInfo<T> >::iterator p;

p = findPtrlnfo(addr);

if(p->refcount) p->refcount-; уменьшает счетчик ссылок на единицу

#ifdef DISPLAY

cout GCPtr going out of scope.\n ; #endif

Собирает мусор, когда указатель выходит за пределы области видимости, collect();

На практике вы можете захотеть собирать



II неиспользуеьаую память реже, к примеру, когда gclist достигнет определенного размера или после того как определенное число указателей GCPtr выйдет за пределы областивидимости, или когда доступная память иссякнет.

Сбор мусора. Возвращает true, если хотя бы один объект был удален, template <class Т, int size> bool GCPtr<T. size>::collect 0 { bool memfreed = false;

#ifdef DISPLAY

cout Before garbage collection for ;

showlistO; #endif

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

Просматривает gclist для обнаружения указателей, ни на что не ссылагацихся.

for(p = gclist.beginO ; р != gclist.endO; р++) { Если используется, пропустить, if(p->refcount > 0) continue;

memfreed = true;

Удаляет неиспользуемый элемент из списка gclist. gclist.remove(*p);

Освобождает память, пока GCPtr не станет равным null, if (p->memPtr) { if(p->isArray) { #ifdef DISPLAY

cout Deleting array of size p->arraySize endl;

#endif

delete [] p-memPtr; удаляет массив



else {

#ifdef DISPLAY

cout Deleting:

*(T *) p->inemPtr \n ;

#endif

delete p->memPtr; удаляет единичный элемент

Возобновляет поиск, break;

} While(р != gclist.endO);

#ifdef DISPLAY

cout After garbage collection for ;

ShowlistO; #endif

return memfreed;

Перегружает присваивание указателя GCPtr. tenplate <class T, int size> T GCPtr<T, size>::operators(T *t) { list<GCInfo<T> >::iterator p;

Во-первых, уменьшает на единицу счетчик ссылок

для области памяти, на которую указывает в данный момент.

Р = findPtrlnfo(addr);

P->refcount-;

Далее, если новый адрес уже

существует в системе, увеличивает

его счетчик ссыпок. В противном случае создает новый элемент в списке gclist. Р = findPtrlnfo(t);



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

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