Вы пишете после выделенной переменной, и это неопределенное поведение.
Когда следуют строки
CopyCon objCopyCon1;
objCopyCon1.name = "Hai";
CopyCon objCopyCon2(objCopyCon1);
_tcscpy()
копирует 4 символа (3 буквы и нулевой терминатор) в буфер, который по закону может содержать только один символ. Таким образом, вы пишете после окончания буфера, и это приводит к повреждению кучи.
Вам нужно выделить буфер нужного размера:
CopyCon(const CopyCon &objCopyCon)
{
name = new char[_tcslen(objCopyCon.name) +1];
_tcscpy(name,objCopyCon.name);
}
также вам нужно изменить delete
в деструкторе на delete[]
, а также изменить все другие вызовы new
на new[]
, чтобы избежать неопределенного поведения.