|
Программирование >> Формирование пользовательского контейнера
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);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |