如何正确释放二维数组C++

Air*_*ezx 0 c++ arrays destructor memory-management

我们刚刚收到 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;
}
Run Code Online (Sandbox Code Playgroud)

分配内存的代码非常简单,我将粘贴它以使事情更清楚,但有问题的部分在上面的代码中。

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

他们正确地剥夺了积分吗?我的dtor实施确实无效吗?

Ant*_*ala 5

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

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

此外,delete与 s 相比,复合材料的 s 将以相反的顺序执行new(您已经这样做了)。

这样我们就得到

~Matrix() {
    for (int i = 0; i < _rows; i++) {
        delete[] _arr[i];
    }
    delete[] _arr;
}
Run Code Online (Sandbox Code Playgroud)