|
Программирование >> Формирование пользовательского контейнера
11етинг 3.3. Сборщик мусора, выполняющийся как фоновая задача include <iostreain> #include <list> #include <typeinfo> #include <cstdlib> #include <windows.h> #include <process.h> iising namespace std; Для наблюдения за сбором мусора включите DISPLAY. #define DISPLAY Генерируется исключение при попытке использовать итератор Iter, выходящий за границы базового объекта (underlying object). class OutOfRangeExc { Добавьте обработку, необходимую вашему приложению. Генерируется исключение при превышении времени ожидания исключительного права доступа к hMutex. class TimeOutExc { Добавьте обработку, необходимую вашему приложению. Класс, подобный итератору, для обработки в цикле массивов, на которые указывгиот объекты GCPtr. Указатели Iter ** не ** участвуют в сборе мусора и не влияют на него. Таким образом, указание с помощью Iter на какой-либо объект не препятствует удалению этого объекта из памяти. ролная версия многопоточного сборщика мусора в листинге 3.3 приведена полностью многопоточная версия сборщика мусора. Назовите этот файл gcthrd.h. tenplate <class Т> class Iter { T *ptr; текущее значение указателя Т *end; указатель на элемент, следующий за последним Т *begin; указьшает на первый элемент размещенного массива unsigned length; длина последовательности (массива) public: Iter О { ptr = end = begin = NULL; length =0; Iter(T p, T *first, T *last) { ptr = p; end = last; begin - first; length = last - first; Возвращает длину последовательности, на которую этот указатель Iter ссылается, unsigned sizeO return length; } Возвращает значение, на которое указьшает ptr. Не допускает обращения за границы. Т &operator*() { if( (ptr >= end) II (ptr < begin) ) throw OutOfRangeExc(); return *ptr; Возвращает адрес, содержащийся в ptr. Не допускает обращения за границы. Т *operator->() { if( (ptr >= end) II (ptr < begin) ) throw OutOfRangeExc(); return ptr; fQlnOr04H0CTb префикс ++. Iter cperator++() { ptr++; return *this; Префикс -. Iter operator-() { ptr-; return *this; Постфикс ++. Iter operator++{int notused) { T *tnp = ptr; ptr++; return Iter<T>{tnp, begin, end); Постфикс -. Iter operator-(int notused) { T *tnp = ptr; ptr-; return Iter<T>(titp, begin, end); Возвращает ссыпку на объект с заданным индексом. Не допускает обращения за границы. Т &operator[](int i) { if( (i < 0) II (i >= (end-begin)) ) throw OutOfRangeExc(); return ptr[i]; Определяет операции отношения, bool operator==(Iter op2) { return ptr == op2.ptr;
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |