说我做这样的事情:
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
最后一行将释放newArr,从而也释放arr。但是包含5的内存块怎么了?它现在是一个永远无法再次访问的内存泄漏吗?如果是这样,我应该如何确保永远不会泄露这个内存,同时成功重新分配原始数组呢?
答案 0 :(得分:1)
int* arr = new int[30]; int* newArr = new int[30]; arr[15] = 5; newArr[15] = 9; arr = newArr; delete[] newArr;
最后一行将释放newArr,从而也释放arr。
不完全。 newArr
和arr
只是指向内存块的名称。你并没有真正地释放newArr",你释放它当前指向的内存块。在那一刻恰好是arr
当前指向的同一块。
但是包含5的内存块发生了什么?
它仍然标记为已使用,但程序中的任何内容都无法再次指向它。您曾经使用的唯一指针是arr
,但您已将arr
分配给其他内容。
它现在是一个永远无法再次访问的内存泄漏吗?
完全。
如果是这样,我该如何确保永远不会有这种记忆 被泄露,同时成功地重新分配 原始阵列?
忘记所有这些动态数组废话并使用std::vector
。
std::vector<int> arr(30);
std::vector<int> newArr(30);
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
答案 1 :(得分:0)
最后一行将释放
newArr
,从而释放arr
使用free(p)
,您不会释放p
,但内存块指向p
。
使用arr = newArr
,您基本上“丢失了”arr
最初指向的动态分配的内存块的“跟踪”,这意味着您无法再在以后的某个时间点解除分配。执行你的程序,因此内存泄漏变得不可避免。