2016-11-20 49 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 []',而是使用新的位置(它允許它以一種智能的方式預先保留內存)。這並不是說這對你有很大的幫助。你必須學習如何實現你的賦值操作符,以便釋放舊的內存。提示:在你的析構函數釋放內存,查找「規則三」,並實現與「複製和交換」的成語任務。 –