2017-10-01 61 views
2

我是動態分配和指針的新手。我將嘗試從文件中填充2D動態數組,然後在其上應用迷宮求解算法(牆跟隨器)。什麼時候應該使用刪除? (在動態創建的2d陣列後不刪除的後果)

假設我創建了一個動態分配的二維數組是這樣的:

int** board; 
board = new int* [rowsize]; 

for(int row = 0; row < rowsize; row++) 
{ 
    board[row] = new int[colsize]; 
} 

如果我知道,我不會使用這個指針,另一個變量,我可以不使用刪除board脫身?如果不是可能會出錯的地方(如果你熟悉牆追隨者算法)?又如何刪除一個指針指針,delete board就足夠了?

回答

1

可我不使用刪除board脫身?

是的,但不是很長時間:重複失敗刪除您的程序分配的數組是一個內存泄漏,最終運行您的進程內存不足。

如何刪除指針的指針,delete board就足夠了?

不,你將需要刪除您分配和內部存儲board每個指針:

for(int row = 0; row < rowsize; row++) { 
    delete[] board[row]; 
} 
delete[] board; 

注意括號delete後表明您刪除陣列,它們是非常重要的。

爲矩形矩陣分配一個釋放內存是C++庫中解決的問題。切換到使用向量的載體,以避免動態資源分配:

std::vector<std::vector<int>> board(rowsize, std::vector<int>(colsize, 0)); 
+0

這是我沒有得到。假設我只是爲了一個目的而使用該程序。含義:從文件中讀取數據,通過迷宮,打印出路徑,然後退出。它是如何還有內存泄漏?當我使用指針指向另一個位置時,我認爲引用了內存泄漏,現在前一個位置是不可訪問的。在這樣一個簡單的程序中,我很難想象'泄漏'的內存。 –

+1

@LucAux當你調用'new'和'delete'是我們的平衡時,會發生內存泄漏。當程序退出時,OS清理程序後面的「混亂」,包括內存泄漏,未關閉的文件描述符等等。但是,如果您想通過內存分析器運行您的代碼,或者其他人複製您的代碼以便在循環中運行代碼,最好自行清理它們。 – dasblinkenlight

1

如果不刪除分配的數組,它們將繼續消耗內存,直到程序終止。這在技術上可能不是錯誤的,但這是浪費。

關於刪除board - 不,這是不夠的。您應該刪除每個指針您分配與new

for(int row = 0; row < rowsize; row++) 
{ 
    delete[] board[row]; 
} 
delete[] board; 
1

你需要delete什麼是分配內存你。這意味着你不會釋放指針本身,而是指向它指向的堆的內存。所以,你只需要做delete[] board。這將釋放int*陣列。在這種情況下使用[]並不是必須的,因爲它是一個基本類型的數組,但是它總是用於數組是非常好的做法,所以當它不是這樣時你不會搞砸。

在數組上調用delete[]將調用數組內部所有對象的析構函數,以及釋放數組。然而,對於基本類型而言不是必需的。

另請注意,您不需要免費獲得int** board。指針是像其他任何具有某種特殊功能的變量一樣的變量,但是當您像這樣聲明它們時,它們就像其他任何其他變量一樣被分配到棧中。

希望它有幫助:)