Данное (*p)
Объект
|
При освобождении памяти в a1 ( или в a2) стирается наше единственное данное, т.е. и второй объект разрушается.
Правильным копированием при наличии в объекте динамического данного будет выделение для создаваемого при копировании объекта нового участка памяти.
Объект a1
|
Данное (*p)
|
Данное (*p)
В этом случае объекты a1 и a2 будут указывать на разные поля. Уничтожение одного из них вызовом деструктора, никак не отразится на существовании другого. Именно это и выполняется в нашем конструкторе копирования.