Возьмем два объекта одного типа (A и B), содержимое которых должно быть скопировано в B. Посмотрим, как это копирование будет происходить в случае глубокого и мелкого копирование.
Мелкое копирование
В этом случае копия ссылок/адресов на A копируется в B. Следовательно, адреса A и B будут такими же, поскольку они будут указывать на одно и то же место в памяти.
Когда один из двух указателей объекта удаляется, другой объект также теряет указанный объект. Это связано с тем, что другой объект все еще указывает на уже освобожденное выделение памяти. Теперь другой указатель на неудаленный объект — это висячий указатель .
При работе с большим количеством указателей во время программирования неглубокое копирование — плохая идея, поскольку удаление одного из объектов, на которое есть ссылка, даже случайно, означает, что теперь в коде много висячих указателей.
Глубокая копия
В случае глубокого При копировании создаются копии всех элементов A, память выделяется в другом месте для B, а скопированные элементы назначаются B. Более точным термином для использования будет «клонирование», поскольку они идентичны, но разные ( т.е. хранятся как два разных объекта в пространстве памяти).
Теперь в В случае глубокого копирования, если один указатель объекта удален, другой по-прежнему будет иметь доступ к значению указанного объекта, потому что оно все еще действует в памяти.
Глубокое копирование потребляет гораздо больше памяти, но делает ваш код более надежным. Это также устраняет риск висящих указателей в коде, поскольку каждый указатель объекта указывает на другое место в памяти.