簡體   English   中英

為什么我必須釋放 2D 數組兩次以避免 memory 泄漏?

[英]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。 截圖1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM