问题描述
如果我创建了一个动态的 Zebra 数组,然后说,我创建了一个新的 Temp 数组,我想在其中传输原始数组中的对象。
然后我将指针从原始数组移动到 Temp。我需要在移动数组 = temp 之前删除旧的数组项吗?
此外,我似乎泄漏但不知道为什么,我似乎同时删除了数组和指针。
class Zebra {
public:
//int age = 0;
};
int main() {
Zebra** array = new Zebra * [10];
for (int i = 0; i < 10; i++) {
array[i] = new Zebra;
}
Zebra** temp = new Zebra * [20];
for (int i = 0; i < 10; i++) {
temp[i] = array[i];
}
// do i need to delete the old array items before move array = temp?
array = temp;
delete[]temp;
temp=NULL;
for (int i = 0; i < 10; i++) {
delete[]array[i];
array[i]=NULL;
}
delete[]array;
array= NULL;
}
解决方法
你有你要向后删除的东西,你想要:
delete[] array;
array = nullptr;
array = temp;
for (int i = 0; i < 10; i++) {
delete array[i];
array[i] = NULL;
}
delete[] array;
array = NULL;
请注意,您还错误地使用了 delete[]
,其中 delete
应该单独用于释放 array[i]
元素。
为什么会这样?
最初您为指针 array
分配了一个内存块,其中包含十个指向 Zebra
的指针。然后当您创建 temp
两倍大的 array
并将 array
中的每个指针分配给 temp
时,您的 temp
保存每个 {{1} 的起始地址}}(其中array[i]
)。
您所做的只是0 <= i < 10
,它释放了保存原始存储空间的内存块,用于delete[] array
指向10
的指针。当您分配 Zebra
现在数组指向 array = temp;
指向 20
的指针的新内存块。
所以在您的重新分配方案中,您刚刚创建了一个更大的指针块,将所有从 Zebra
分配给 array
,删除了原始指针块,并将新的指针块分配给 { {1}}(完成)。 (本质上是在做 temp
在 C 中所做的)
完整的例子是:
array
内存使用/错误检查
realloc()