首页 > 解决方案 > 为什么我必须释放 2D 数组两次以避免内存泄漏?

问题描述

我在分配二维数组时遇到了内存泄漏问题。
但我不明白为什么内存泄漏。

我的理由是,在 Note A 处,我已经释放了分配的内存,因为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_;
};

标签: c++

解决方案


你发布的并不是一个真正的二维数组,它是一个一维指针数组(data_),然后你为第一个数组的每个元素分配一个单独的整数数组(整数data_[0]数组也是一个整数数组,依此类推)。cdata_[1]c

鉴于此,很自然地,您必须delete[]在析构函数中为new之前在构造函数中执行的每个操作执行一次。

您的内存分配以及它们如何相互指向的图形图可能如下所示(如果c==6并且您已将所有数组的整数设置为0):

分配图

真正的 2D 数组分配看起来像这样: int * array2D = new int[6][8];,但是如果数组维度是编译时常量,当然 C++ 只支持 2D 数组,所以这可能无法解决您的Matrix类要解决的问题。


推荐阅读