Правила использования класса GCPtr |
Применять объекты класса GCPtr очень просто. Сначала подключите файл gc.h. Затем объявите объект GCPtr, указав тип данных, на которые он будет указывать. Например, для декларации объекта р типа GCPtr, который может указывать на данные типа int, используйте следующее объявление: GCPtr<int> р; lip может указывать на объекты типа int Затем динамически выделите память, применив операцию new, и присвойте переменной р указатель, возвращаемый операцией new, как показано далее. р s new int; // р присваивается адрес объекта типа int Вы можете присвоить значение объекту, размещенному в динамической памяти с помощью подобной операции присваивания: *р - 88; // присваивается значение объекту типа int Конечно, можно применить комбинацию приведенных ранее операторов, как показано далее. GcPtr<int> р = new int(88); // объявление и инициализация Вы можете получить числовое значение объекта типа int, на который указывает объект р, с помощью следующего оператора: int к = *р; Как видно их приведенных примеров, в основном вы используете объект типа GCPtr как обычный указатель языка С++. Отличие лишь в том, что вам не нужно удалять такой указатель после завершения работы с ним. Память, отведенная этому указателю, будет очищена автоматически, когда она больше не понадобится. В листинге 2.2 приведена программа, объединяющая фрагменты, описанные ранее. -=--------~-----------г~------------:-------------"-------------------------------------' Ди|тинг 2.2. Пример использования объекта GCPtr ¦include <iostream> ¦include <new> ¦include "gc.h" using namespace std; int mainO ( GCPtr<int> p; try { P = new int; > catch(bad_alloc exc) { cout « "Allocation failure!\n"; return 1; } *р = 88; cout « "Value at p is: " « *p « endl; int к = *p; cout « "k is " « к « endl; return 0; } Далее приводится вывод программы с включенным режимом отображения (напоминаю, что вы можете наблюдать действие сборщика мусора, определив макрос DISPLAY в файле gc.h). Constructing GCPtr. Value at p is: 88 k is 88 GCPtr going out of scope. Before garbage collection for gclist<int, 0>: memPtr refcount value [002F12C0] 0 88 [00000000] 0 Deleting: 88 After garbage collection for gclist<int, 0>: memPtr refcount value — Empty — Когда программа завершается, объект р уходит за пределы области видимости. Это приводит к вызову деструктора, который уменьшает на единицу счетчик ссылок, связанный с памятью, на которую указывает объект р. Поскольку на эту память ссылается только указатель р, уменьшение связанного с ним счетчика ссылок делает его значение равным нулю. Затем деструктор объекта р вызывает функцию collect (), которая ищет в списке gclist элементы, счетчики ссылок которых равны нулю. У элемента списка, ранее связанного с объектом р, счетчик ссылок содержит нулевое значение, следовательно, память, на которую указывает этот объект, освобождается. ?ше одно замечание: до сбора мусора в списке gclist присутствует элемент с пустым указателем. Этот указатель был сформирован, когда создавался объект р. Напомню, что если объекту GCPtr не задать начального адреса, то используется пустой или неопределенный адрес (который равен нулю). Хотя технически нет необходимости запоминать пустой адрес в списке gclist (так как он никогда не освобождается), подобное действие упрощает обработку других объектов типа GCPtr , поскольку гарантирует включение каждого ИЗ НИХ В СПИСОК gclist.
|