Главная arrow С++ (часть 4) arrow Копирующий конструктор класса GCPtr

Копирующий конструктор класса GCPtr

Из-за необходимости отслеживать связь указателя с выделенной памятью нельзя применять стандартный копирующий конструктор (создающий поразрядную идентичную копию). Вместо этого класс GCPtr должен определить собственный конструктор копирования, приведенный далее.
// Копирующий конструктор. GCPtr(const GCPtr &ob)  {
list<GCInfo<T> >::iterator p;
p = findPtrlnfo(ob.addr);
p->refcount++; // увеличивает счетчик ссылок
addr = ob.addr;
arraySize = ob.arraySize;
if(arraySize > 0) isArray = true;
else isArray = false;
#ifdef DISPLAY
cout « "Constructing copy.";
if(isArray) cout « " Size is " « arraySize « endl;
else cout « endl; ttendif
}
Напоминаю, что копирующий конструктор класса вызывается, если требуется копия объекта в тех случаях, когда объект передается как параметр функции и возвращается функцией, или когда один объект используется для инициализации другого объекта. Копирующий конструктор класса GCPtr дублирует информацию, содержащуюся в объекте-оригинале. Он также увеличивает на единицу счетчик ссылок, связанный с фрагментом памяти, на которую указывает объект-оригинал. Когда копия выходит за пределы области видимости, этот счетчик ссылок уменьшается на единицу.
В действительности дополнительная обработка, выполняемая копирующим конструктором, как правило, не нужна, потому что перегруженные операции присваивания должным образом поддерживают состояние списка сбора мусора в большинстве случаев. Однако существует несколько ситуаций, требующих применения копирующего конструктора, например, при выделении памяти внутри функции и возврате из нее объекта типа GCPtr, указывающего на этот фрагмент памяти.