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

1 ... 41 42 43 [ 44 ] 45 46 47 ... 156


jjMrvnOTCNHOCTb 135

II Создает как инициализированные, так и неинициализированные объекты. GCPtr(Т *t=NULL) {

Когда создается первый объект, создает также мьютекс и регистрирует функцию shutdownO. if(hMutex==0) {

hMutex = CreateMutex(NULL, 0, NULL); atexit(shutdown);

if(WaitForSingleObject(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc();

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

p = findPtrlnfo(t);

Если элемент есть в списке gclist,

увеличивает его счетчик ссыпок на единицу.

В противном случае добавляет этот элемент в список.

if(p != gclist.endO)

p->refcount++; наращивает счетчик ссыпок else {

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

addr = t;

arraySize = size;

if(size > 0) isArray = true;

else isArray = false;

Наращивает счетчик экземпляров при создании

каждого нового объекта.

instCount++;

Если поток для сбора мусора не выполняется, запускает его. if(hThrd==0) {



Деструктор объекта GCPTr. -GCPtrО;

Собирает мусор. Возвращает true, если хотя бы один объект уничтожен, static bool collectO;

hThrd = (HANDLE) beginthreadex(NULL, 0, gc,

(void *) 0, 0, (unsigned *) &tid) ; Для некоторьрс приложений лучше понизить приоритет сборщика мусора, как показано далее:

SetThreadPriority(hThrd,

THREAD PRIORITY BELOW NORMAL);

ReieaseMutex(hMutex);

Копирующий конструктор, GCPtr(const GCPtr &ob) {

if(WaitForSingleObject(hMutex, 10000)==WAIT TIMEOUT) throw TimeOutExc () ;

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

p = findPtrlnfo(ob.addr);

p->refcount++; увеличиваем счетчик ссылок

addr = ob.addr;

arraySize = ob.arraySize;

if(arraySize > 0) isArray = true;

else isArray = false;

instCount++; увеличиваем счетчик экземпляров с учетом копии ReieaseMutex(hMutex);



fforonoTOHHocTb

Перегружает присваивание указателя объекту GCPtr. Т *operator=(T *t);

Перегружает присваивание одного объекта GCPtr другому объекту GCPtr. GCPtr &operator=(GCPtr &rv);

Возвращает ссылку на объект, на который указьшает этот экземпляр GCPtr. Т &operator*() {

return *addr;

Возвращает адрес, на который указывает объект GCPtr. Т *operator->() {return addr; }

Возвращает ссылку на объект с индексом, заданным i. Т &operator[](int i) { return addr[i];

Функция преобразовании для Т *. operator Т *() { return addr; }

Возвращает Iter на начало выделенного фрагмента памяти. Iter<T> beginO { int size;

if(isArray) size = arraySize; else size = 1;

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

Возвращает Iter на элемент, следующий за последним в размещенном массиве. Iter<T> endО { int size;



1 ... 41 42 43 [ 44 ] 45 46 47 ... 156

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