Использование объекта GCPtr с классами |
Объект типа GCPtr применяется для указания на классы так же, как на встроенные типы. В листинге 2.7 приведена программа, размещающая в динамической памЯТИ Объекты ТИПа MyClass. i Листинг 2.7. Использование объекта типа ocptr с классами ! :___________________________________________;_____________________________J #include <iostream> #include <new> #include "gc.h" using namespace scd; class MyClass { int a, republic: double val; MyClassO { a = b = 0; } MyClass(int x, int y) { a = x; b = y; val = 0.0; } -MyClassO { cout « "Destructing MyClass(" « a « ", " « b « ") \n" ; } int sum() { return a + b; } friend ostream fcoperator«(ostream istrm, MyClass &obj); ); // Перегруженная вставка (inserter) в поток вывода для отображения полей // класса MyClass. ostream &oper a tor«(ostream &strm. MyClass &obj) { strm « "(" « obj.a « " " « obj.b « ")"; return strm; ) intmaino { try { GCPtr<MyClass> ob = new MyClass(10, 20); // Отображение значения с помощью перегруженной вставки / / в поток вывода. couc « *ob « endl; II Смена объекта, на который указывает ob. ob = new MyClassdl, 21); cout « *ob « endl; // Вызов функции-члена класса с помощью объекта GCPtr. cout « "Sum is : " « ob->sum() « endl; // Присваивание значения члену класса с помощью объекта GCPtr ob->val = 98.6; cout « "ob->val: " « ob->val « endl; cout «, "ob is now " « *ob « endl; } catch(bad_alloc exc) { cout « "Allocatino error!\n"; return 1; } return 0; } Обратите внимание на то, что доступ к данным-членам класса MyClass осуществляется с помощью операции ->. Напоминаю, что тип GCPtr описывается как указатель. Следовательно, операции с участием объекта GCPtr выполняются точно так же, как с любым другим указателем. Далее приведен вывод программы с выключенным режимом отображения. (10 20) (11 21) Sum is : 32 ob->val: 98.6 ob is now (11 21) Destruccing MyClass(11, 21) Destructing MyClass(10, 20) Обратите особое внимание на две последние строки. Это вывод деструктора -MyClass во время сбора мусора. Несмотря на то, что создан всего один указатель типа GCPtr, в динамической памяти размещены два объекта типа MyClass. Оба они представлены как элементы в списке сбора мусора. Когда указатель ob уничтожается, проверяется список gclist в поисках элементов с нулевыми счетчиками ссылок. В данном случае найдены два таких элемента, и память, на которую они указывают, освобождается.
|