2016-11-20 45 views
-2

说我做这样的事情:如何在重新分配指针时处理手动内存管理?

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

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

+1

_“从而也释放arr”_咦? –

+0

@πάνταῥεῖarr和newArr指向相同的东西,所以我错误地说我用'delete [] newArr'释放他们两个? –

+0

解放这两个相同的东西?那是什么意思? – juanchopanza

回答

0

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

随着free(p),你是不是释放p但内存块通过p指出。


随着arr = newArr,你基本上是“失去了踪迹”最初由arr指向的动态分配的内存块,这意味着你不能再释放它在以后的某个程序的执行,因此内存泄漏不可避免。

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

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

不太。 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; 
+0

“忘掉这一切动态数组废话和使用'的std :: VECTOR'”滑稽你提到这一点,因为我居然遇到了这个问题,而试图实现我自己在C++为实践载体类,并将其击败的目的在你自己的矢量实现中使用std :: vector。指针被使用,因为矢量实现中的底层数组需要在某个点调整大小,但我不太确定如何做到这一点,而不会造成内存泄漏... –

+0

@CoffeeMaker:'std :: vector''s实现不使用'new []',而是使用新的位置(它允许它以一种智能的方式预先保留内存)。这并不是说这对你有很大的帮助。你必须学习如何实现你的赋值操作符,以便释放旧的内存。提示:在你的析构函数释放内存,查找“规则三”,并实现与“复制和交换”的成语任务。 –