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

1 ... 4 5 6 [ 7 ] 8 9 10 ... 156


Листинг 2.1. Однопоточный сборщик мусора

#include <iostreain> #include <list> #include <typeinfo> #include <cstdlib>

using namespace std;

Для наблюдения за работой сборщика мусора определите DISPLAY.

в соответствии с которой auto ptr владеет объектом, на который указывает. Право собственности может быть передано другому указателю auto ptr, но в любом случае какой-либо auto ptr будет владеть объектом до тех пор, пока последний не будет удален. Более того, указателю auto ptr присваивается адрес объекта, только когда объект инициализируется. После этого вы не можете изменить память, на которую указывает auto ptr, за исключением присваивания одного указателя auto ptr другому. Из-за характеристики строгого владения, присущей классу auto ptr, он не может быть полезным при сборе мусора и не применяется в сборщике мусора, приведенном в этой книге.

Простой сборщик мусора на С++

в листинге 2.1 приведен полный код сборщика мусора. Как уже объяснялось ранее, данный сборщик мусора функционирует благодаря созданию указателя нового типа, обеспечивающего встроенную поддержку сбора мусора, основанную на алгоритме подсчета ссылок. Сборщик мусора однопоточный, что означает, что он полностью переносим и не зависит от среды исполнения (и не строит никаких иллюзий на ее счет). Приведенный код следует сохранить в файле с именем gc.h.

При просмотре кода обратите внимание на две особенности. Во-первых, больщинство функций-членов очень короткие и определены внутри их классов для повышения эффективности. Напоминаю, что функция, определенная в пределах ее класса, автоматически встраивается в его описание, что устраняет расходы на ее вызов. Только несколько функций длинны настолько, что требуют описания вне их класса.

Во-вторых, прочтите комментарий в начале файла. Если вы хотите увидеть действие сборщика мусора, просто включите режим отображения, определив макрос, названный display. В нормальном режиме оставьте display неопределенным.



II #define DISPLAY

Исключение генерируется при попытке использовать объект Iter, выходящий за пределы диапазона базового объекта.

class OutOfRangeExc {

Добавьте функциональные возможности, если они необходимы для вашего приложения.

Класс-итератор (iterator-like) для циклического перемещения

в массивах, на которые указывают указатели GCPtr. Указатели Iter

** не участвуют **в сборе мусора и не влияют на него.

Следовательно, указание с помощью Iter

на какой-либо объект не препятствует

освобождению отведенной объекту памяти.

template <class Т> class Iter {

Т *ptr; значение текущего указателя

Т *end; указывает на элемент, следующий за последним элементом Т *begin; указывает на начало распределенного массива imsigned 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. Не разрешает выход за пределы диапазона. Т toperator*() {

if{ (ptr >= end) II (ptr < begin) )

throw OutOfRangeExc() ;

return *ptr;

Возвращает адрес, содержащийся в ptr.

Препятствует выходу за пределы диапазона.

Т *operator->() {

if( (ptr >= end) II (ptr < begin) ) throw OutOfRangeExc () ;

return ptr;

Префикс ++. Iter operator++() { ptr++;

return *this;

Префикс --. Iter operator-() { ptr~;

return *this;

Постфикс ++.

Iter operator++(int notused) { T *tirp = ptr;

ptr++;

return Iter<T>(titp, begin, end);



1 ... 4 5 6 [ 7 ] 8 9 10 ... 156

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