重新分配指针时如何处理手动内存管理?

时间:2016-11-20 11:13:05

标签: c++ arrays pointers memory-leaks

说我做这样的事情:

int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;

最后一行将释放newArr,从而也释放arr。但是包含5的内存块怎么了?它现在是一个永远无法再次访问的内存泄漏吗?如果是这样,我应该如何确保永远不会泄露这个内存,同时成功重新分配原始数组呢?

2 个答案:

答案 0 :(得分:1)

int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
     

最后一行将释放newArr,从而也释放arr。

不完全。 newArrarr只是指向内存块的名称。你并没有真正地释放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最初指向的动态分配的内存块的“跟踪”,这意味着您无法再在以后的某个时间点解除分配。执行你的程序,因此内存泄漏变得不可避免。