【问题标题】:How to properly deallocate 2d array c++如何正确释放二维数组 C++
【发布时间】:2015-05-10 06:02:02
【问题描述】:

我们刚刚收到了 C++ 期末考试的结果。其中一个问题是写一个简单的二维矩阵double的表示。 我在析构函数实现中推断出一些要点,注释为invalid implementation,没有进一步的信息。你能告诉我哪里出错了(如果我确实出错的话)。

这是我写的代码:

~Matrix() {
   for (int i=0; i<_rows; i++) {
       for (int j=0; j<_cols; j++) {
          delete _arr[i][j];
        }
        delete _arr[i];
    }
    delete [] _arr;
}

分配内存的代码很简单,我把它贴出来让事情更清楚,但有问题的部分在上面的代码中。

Matrix(int rows, int cols) :
_arr(new double*[rows]), _rows(rows), _cols(cols)
{
    for (int i=0; i<_rows; i++) {
        _arr[i] = new double[_cols];
    }
}

他们是否正确地拿走了积分?我的dtor 实现确实无效吗?

【问题讨论】:

  • 你把它弄得一团糟。每个new[] 应该有一个delete[]
  • 如果您的二维矩阵是double 类型,那么delete _arr[i][j]; 正在删除一个双精度,不是吗?
  • std::vector&lt;std::vector&lt;double&gt;&gt; _arr;: _arr(ysize, std::vector&lt;double&gt;(xsize))

标签: c++ arrays memory-management destructor


【解决方案1】:

delete _arr[i][j] 是错误的,不应该在那里; delete _arr[i]; 也是错误的 - 因为这是您使用 new [] 分配的数组,您需要使用 delete [] _arr[i];

经验法则是:每个new 对应一个delete;每个new[] 都有一个delete[]

news(您已经这样做了)相比,组合的deletes 将以相反的顺序执行。

因此我们得到

~Matrix() {
    for (int i = 0; i < _rows; i++) {
        delete[] _arr[i];
    }
    delete[] _arr;
}

【讨论】:

    【解决方案2】:

    你应该为你的每个new[]打电话给delete[],他们应该是配对的。

    ~Matrix() {
       for (int i=0; i<_rows; i++) {
            delete[] _arr[i];
        }
        delete [] _arr;
    }
    

    【讨论】:

      【解决方案3】:

      您有两个new,然后是三个delete。哪里出了问题应该很明显。

      此外,您必须对两个维度都使用 delete [],因为您有一个双数组数组,然后是一个双数组数组(double*[] 和 double[]),这会导致您:

      ~Matrix() {
          for (int i = 0; i < _rows; i++) {
              delete[] _arr[i];
          }
          delete[] _arr;
      }
      

      不必销毁 double 数组的每个值,因为它们不是由 new 创建的

      此外,最简单的实现只使用一个分配:

      Matrix(int rows, int cols) : _arr(new double[rows*cols]), _rows(rows), _cols(cols)
      {
      }
      
      ~Matrix() {
          delete[] _arr;
      }
      

      在此实现中,您应该提供正确的访问器,因为 matrix[i,j] = _arr[i+j*row]matrix[i,j] = _arr[i*cols+j](取决于您在数组中排列值的方式)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-05
        • 2011-08-05
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 2010-12-16
        • 1970-01-01
        相关资源
        最近更新 更多