我们刚刚收到了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
实施确实无效吗?
答案 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]
(取决于您在数组中排列值的方式)。