說我做這樣的事情:如何在重新分配指針時處理手動內存管理?
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
最後一行將釋放newArr,從而也釋放改編。但是包含5的內存塊發生了什麼?它現在是一個永遠不能再次訪問的內存泄漏?如果是這樣,我應該如何確保這個內存永遠不會泄漏,同時成功地重新分配原始數組?
說我做這樣的事情:如何在重新分配指針時處理手動內存管理?
int* arr = new int[30];
int* newArr = new int[30];
arr[15] = 5;
newArr[15] = 9;
arr = newArr;
delete[] newArr;
最後一行將釋放newArr,從而也釋放改編。但是包含5的內存塊發生了什麼?它現在是一個永遠不能再次訪問的內存泄漏?如果是這樣,我應該如何確保這個內存永遠不會泄漏,同時成功地重新分配原始數組?
最後一行將釋放
newArr
,從而也釋放arr
隨着free(p)
,你是不是釋放p
但內存塊通過p
指出。
隨着arr = newArr
,你基本上是「失去了蹤跡」最初由arr
指向的動態分配的內存塊,這意味着你不能再釋放它在以後的某個程序的執行,因此內存泄漏不可避免。
int* arr = new int[30]; int* newArr = new int[30]; arr[15] = 5; newArr[15] = 9; arr = newArr; delete[] newArr;
最後一行將釋放newArr,從而也釋放改編。
不太。 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;
「忘掉這一切動態數組廢話和使用'的std :: VECTOR'」滑稽你提到這一點,因爲我居然遇到了這個問題,而試圖實現我自己在C++爲實踐載體類,並將其擊敗的目的在你自己的矢量實現中使用std :: vector。指針被使用,因爲矢量實現中的底層數組需要在某個點調整大小,但我不太確定如何做到這一點,而不會造成內存泄漏... –
@CoffeeMaker:'std :: vector''s實現不使用'new []',而是使用新的位置(它允許它以一種智能的方式預先保留內存)。這並不是說這對你有很大的幫助。你必須學習如何實現你的賦值操作符,以便釋放舊的內存。提示:在你的析構函數釋放內存,查找「規則三」,並實現與「複製和交換」的成語任務。 –
_「從而也釋放arr」_咦? –
@πάνταῥεῖarr和newArr指向相同的東西,所以我錯誤地說我用'delete [] newArr'釋放他們兩個? –
解放這兩個相同的東西?那是什麼意思? – juanchopanza