416 Часть III. Современное программирование на С++

Развернутое копирование

Забота о реализации процедуры развернутого копирования лежит на разработчике класса. Развернутое копирование делает все то же самое, что и буквальное, и плюс к этому обеспечивает копирование ресурсов, связанных с членами класса — указателями. Эта деятельность состоит в реализации освобождения ресурсов объекта-копии, выделения ему новых ресурсов в количестве, достаточном для хранения-копии данных источника (то есть копируемых данных), и собственно копирования этих данных.

Замечание

Идея развернутого копирования состоит в грамотном воспроизведении блоков памяти. На самом деле конструктор копий и операция присваивания способны не только к манипуляциям с памятью. C++ создан для широкой области приложений. Помимо правильного- перераспределения ресурсов, копирование и присваивание могут быть использованы, например, для инициализации физического состояния аппаратных устройств или внешних процессов. Не ограничивайте свое воображение тем, что написано. В конечном счете, цель этой главы достаточно узка — помочь вам избежать одной из наиболее частых ошибок — утечек памяти.

Рис. 17.2 иллюстрирует то, что мы пытаемся достичь с помощью развернутого копирования. Должным образом определенное развернутое копирование помимо дублирования стековых элементов управляет перераспределением ресурсов динамических членов.

h04161.jpg

//До присваивания Объект 1 и Объект 2 содержат указатели, ссылающиеся // каждый на свой персональный фрагмент памяти. Блоки памяти и //данные в них различны.

// После присваивания Объект 1 и Объект 2 ссылаются на различные // фрагменты памяти, но данные в них одни и те же. Так выглядит //развернутое копирование.

h04162.jpg

h04163.jpg

Рис. 17.2

Иллюстрация логического эффекта развернутого копирования. Каждый объект поддерживает собственные данные, так же как и ресурсы, на которые ссылаются эти данные