416 Часть III. Современное программирование на С++
Развернутое копирование
Забота о реализации процедуры развернутого копирования лежит на разработчике класса. Развернутое копирование делает все то же самое, что и буквальное, и плюс к этому обеспечивает копирование ресурсов, связанных с членами класса — указателями. Эта деятельность состоит в реализации освобождения ресурсов объекта-копии, выделения ему новых ресурсов в количестве, достаточном для хранения-копии данных источника (то есть копируемых данных), и собственно копирования этих данных.
Замечание
Идея развернутого копирования состоит в грамотном воспроизведении блоков памяти. На самом деле конструктор копий и операция присваивания способны не только к манипуляциям с памятью. C++ создан для широкой области приложений. Помимо правильного- перераспределения ресурсов, копирование и присваивание могут быть использованы, например, для инициализации физического состояния аппаратных устройств или внешних процессов. Не ограничивайте свое воображение тем, что написано. В конечном счете, цель этой главы достаточно узка — помочь вам избежать одной из наиболее частых ошибок — утечек памяти.
Рис. 17.2 иллюстрирует то, что мы пытаемся достичь с помощью развернутого копирования. Должным образом определенное развернутое копирование помимо дублирования стековых элементов управляет перераспределением ресурсов динамических членов.
//До присваивания Объект 1 и Объект 2 содержат указатели, ссылающиеся // каждый на свой персональный фрагмент памяти. Блоки памяти и //данные в них различны.
// После присваивания Объект 1 и Объект 2 ссылаются на различные // фрагменты памяти, но данные в них одни и те же. Так выглядит //развернутое копирование.
Рис. 17.2
Иллюстрация логического эффекта развернутого копирования. Каждый объект поддерживает собственные данные, так же как и ресурсы, на которые ссылаются эти данные