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

1 ... 14 15 16 [ 17 ] 18 19 20 ... 156


ранее. Это означает, что она будет вызвана, когда программа завершает свою работу. Далее приведен код функции shutdownO.

Очищает gclist, когда программа завершается, tenplate <class Т, int size> void GCPtr<T, size>::shutdown О {

if (gclistSizeO == 0) return; список пуст

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

for(p = gclist.beginO; p != gclist.endO; p++) {

Устанавливает все счетчики ссылок в ноль. p->refcount = 0;

ttifdef DISPLAY

cout Before collecting for shutdownO for typeid(T) .nameO \n ;

ttendif

collect{);

ttifdef DISPLAY

cout After collecting for shutdownO for typeid(T) .nameO \n ;

#endif

Сначала, если список пуст, как и должно быть, функция shutdownO просто обеспечивает возврат в вызывающую профамму. В противном случае она присваивает нулевые значения счетчикам ссылок элементов, до сих пор остающихся в списке gclist, и затем вызывает функцию collect о. Напоминаю, что функция collect о уничтожает любой объект, у которого значение счетчика ссылок равно нулю. Таким образом, присваивание нулевых значений счетчикам ссылок гарантирует уничтожение всех размещенных ранее объектов.

Класс GClnfo

Информационный список для сбора мусора, хранящийся в объекте gclist, содержит элементы типа Gcinfо. Описание класса ccmfo приведено далее.

Этот класс определяет элемент, который запоминается в информахдионном списке сбора мусора.



gpplate <class Т> class GCInfo { public:

unsigned refcount; текущий счетчик ссылок Т *meniPtr; указатель на выделенную память

/* isArray равен true, если memPtr указьШает на

распределенный массив.

В противном случае false. */ bool isArray; true, если указание на массив

/* Если memPtr указывает на распределенный

массив, то arraySize содержит его размер */ unsigned arraySize; длина или размер массива

Здесь mPtr указывает на вьщеленную память.

Если это массив, в size указывается

размер массива.

GCInfo (Т *mPtr, unsigned size=0) {

refcount = 1;

memPtr = mPtr;

if{size != 0) isArray = true;

else

isArray = false; arraySize = size;

Как упоминалось ранее, каждый объект Gcmf о содержит указатель на выделенную память в поле memPtr и счетчик ссылок, связанный с этим фрагментом памяти, - в поле refcount. Если память, на которую указывает содержимое поля memPtr, хранит массив, следует указать его длину при создании ъекта GCInfo. В этом случае поле isArray устанавливается равным true, а размер массива сохраняется в поле arraysize.

Объекты класса GCinfo помещаются в список стандартного типа list из библиотеки STL. Для того чтобы обеспечить поиск элементов в этом списке.



необходимо определить перегруженную операцию operator== (), код которой приведен далее.

Перегруженная операция == позволяет сравнивать объекты GClnfo. Это необходимо для класса list библиотеки STL. template <class Т> bool operator==(const GCInfo<T> &obl, const GCInfo<T> &ob2) { return (obi.memPtr == ob2.memPtr);

Два объекта равны, только если идентичны их поля memPtr. Используемый вами компилятор может потребовать перефузки других операций для сохранения объектов GClnfo в списке класса list из библиотеки STL.

Класс Iter

Класс Iter реализует объект-итератор, применяемый для обработки в цикле элементов размещенного в динамической памяти массива. Технически этот класс не обязателен, так как объект GCPtr может быть преобразован в нормальный указатель соответствующего базового типа, но у класса iter есть два достоинства. Во-первых, способ циклической обработки элементов массива в нем подобен тому, который используется при обработке содержимого контейнеров в библиотеке STL. Следовательно, синтаксис описания класса Iter привычен. Во-вторых, класс iter не допускает выхода за фаницы массива. Таким образом, он является безопасной альтернативой нормального указателя. Однако следует понимать, что класс iter не участвует в сборе мусора. Следовательно, если базовый объект класса GCPtr, на котором базируется объект Iter, выходит за пределы области видимости, память на которую указывает базовый объект, будет очищена вне зависимости от того, обращается ли к ней объект iter.

Класс Iter - это шаблонный класс, который определяется следующим образом:

Tenplate <class Т> class Iter {

Тип данных, на которые указывает класс iter, передается через класс т.

В классе iter определены следующие экземпляры переменных (instance

variables):

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

Т *end; указывает на элемент, следующий за последним элементом Т *begin; указывает на начало распределенного в памяти массива

неизвестной длины; unsigned length; длина массива



1 ... 14 15 16 [ 17 ] 18 19 20 ... 156

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