Копирующий конструктор класса 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, указывающего на этот фрагмент памяти.
|