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