Ваша переменная dataholder
- это указатель на массив размером backditup
, а не сам массив. Таким образом, когда вы делаете вызовы Zeromemory
и memcpy
, вы не должны брать его адрес; вместо этого напишите:
ZeroMemory(dataholder,sizeof(backditup));
memcpy(dataholder,&backditup,sizeof(backditup));
без &
. Аналогично, когда вы копируете данные обратно, вы хотите:
memcpy(&restorenaarhier,dataholder,sizeof(restorenaarhier));
И, наконец, вам нужно сделать то же самое исправление во втором вызове Zeromemory
- хотя, поскольку вы удаляете массив сразу после этого вызова, на самом деле нет никакого смысла вообще иметь этот вызов.
Размер во втором вызове Zeromemory
является ошибочным по той же причине; sizeof(dataholder)
- это размер указателя, а не массива, на который он указывает. Если вы не просто полностью удалите этот вызов, вы должны либо использовать sizeof(backditup)
здесь для согласованности с объявлением, либо, что еще лучше, объявить переменную для хранения длины массива держателей данных и использовать ее последовательно. (Или вы можете использовать размер типа данных, sizeof(testclass)
- это, вероятно, лучший вариант.)
Наконец, как отметил Марк Уилкинс в своем ответе, вам нужно удалять массивы с delete[]
, а не delete
, чтобы избежать повреждения кучи.