Главная arrow С++ (часть 3) arrow Использование объекта GCPtr с классами

Использование объекта 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 в поисках элементов с нулевыми счетчиками ссылок. В данном случае найдены два таких элемента, и память, на которую они указывают, освобождается.