如何正确释放2d数组c ++

时间:2015-03-09 05:53:49

标签: c++ arrays memory-management destructor

我们刚刚收到了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实施确实无效吗?

3 个答案:

答案 0 :(得分:2)

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

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

delete s(你已经做过)相比,new复合材料的执行顺序相反。

因此我们得到了

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

答案 1 :(得分:0)

您应该为每delete[]个人致电new[],他们应该配对。

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

答案 2 :(得分:0)

您有两个new,然后三个delete。什么是错的应该是显而易见的。

此外,你必须对两个维使用delete [],因为你有一个双数组数组,然后是一个double(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](取决于您在数组中排列值的方式)。