Проблема с вашим конструктором копирования заключается в том, что он просто назначает p.name:
name = p.name // Now this and p hold a pointer to the same memory
Поскольку и this
, и p
теперь содержат указатель на одно и то же место в памяти, то, что будет уничтожено первым, освободит память, в то время как второе будет содержать указатель на несуществующий объект. Впоследствии использование этого указателя или его удаление приведет к неопределенному поведению. Решение состоит в том, чтобы выделить новый массив для имени и скопировать содержимое p.name в этот массив, чтобы память не была общей.
Аналогично, ваша функция инициализации перезаписывает имя, игнорируя тот факт, что память была выделена (это утечка памяти), а также игнорируя тот факт, что строка будет позже уничтожена (даже если вызывающая сторона, вероятно, ожидает владения и освобождения этой строки). сама строка). Также я должен отметить, что ваша функция show принимает параметр «n», но вместо этого использует «name». Ваша функция show, вероятно, не должна принимать какие-либо параметры (в действительности, то, как вы ее называете, подразумевает, что она этого не делает), учитывая, что все необходимые поля уже присутствуют в вашем классе (или, возможно, вы намеревались сделать это автономной функцией). что занимает поля класса?). Вы должны еще раз взглянуть на свой код для дополнительных ошибок.