[英]Why do I have to free 2D array twice to avoid memory leak?
在分配二維數組時,我遇到了 memory 泄漏問題。
但我不明白為什么 memory 會泄漏。
我的理由是,在 Note A 處,我已經釋放了分配的 memory,因為data_[0] == data_
,為什么我必須在 Note B 處釋放?
class Matrix {
public:
Matrix(int r, int c) {
this->rows = r;
this->cols = c;
data_ = new int*[r];
for (int i = 0; i < r; i++) {
data_[i] = new int[c];
}
}
~Matrix() {
for (int i = 0; i < this->rows; i++) {
delete [] data_[i]; // Note A;
}
delete[] data_; // Note B; <-- not doing this line will leak memory, but why?
}
private:
int rows;
int cols;
int **data_;
};
您發布的內容並不是真正的二維數組,而是一維指針數組( data_
),然后為第一個數組的每個元素分配一個單獨的整數數組(因此data_[0]
是c
整數數組, data_[1]
是c
整數數組,依此類推)。
鑒於此,很自然,您必須在析構函數中為您之前在構造函數中執行的每個new
執行一次delete[]
。
您的 memory 分配以及它們如何相互指向的圖形圖可能如下所示(如果c==6
並且您已將所有數組的整數設置為0
):
真正的二維數組分配如下所示: int * array2D = new int[6][8];
,但當然 C++ 僅支持 2D arrays 如果數組維度是編譯時常量,那么這可能無法解決您的Matrix
ZA2F2ED4F8EBC2CBB4C21A29DC40AB6D1 旨在解決的問題。
當您創建 2D 數組(例如 3x3)時,您創建了 1 個包含 3 個元素的數組,其中每個元素都是指向單獨數組的指針。 因此,要清除此矩陣的 memory,您需要清除 4 arrays(3 行和 1 個包含指針的數組)。 您可以檢查您在代碼中調用 new 運算符的次數,它將是 r+1 次
data_ = new int*[r];// 1 time
for (int i = 0; i < r; i++ {
data_[i] = new T[c]; // r times
}
第一部分:行data_ = new int*[r];
通過new分配並默認初始化一個int*的動態數組,因此您需要提供相應的delete [] data_;
對於這條線。
第二部分:行data_[i] = new int[c];
動態分配並默認初始化一個 int 數組,然后返回指向第一個元素的指針並將其存儲為data_[i]
元素。 所以在這里你需要一個相應的delete [] data_[i];
擺脫 memory 泄漏。 因此,這就是您需要兩個單獨的delete []
的原因。 該過程如屏幕截圖所示。 另請注意,重要的是默認初始化。 因此,正如@Jeremy Friesner 在答案中錯誤顯示的那樣,int 數組元素的值不會全部為 0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.