当我尝试删除关于distractor的指针时,我的程序崩溃了,为什么? 我的代码中没有理解我做错了什么。
我是否使用了新的错误?
类矩阵:
class Matrix
{
private:
double **_array;
int _rows, _cols;
...
Matrix::Matrix(int rows, int cols)
{
if (rows <= 0 || cols <= 0)
exit(-1);
this->_array = new double*[rows];
for (int i = 0; i < rows; i++)
this->_array[i] = new double[cols];
this->_rows = rows;
this->_cols = cols;
}
问题在于:
void Matrix::pow(int power, Matrix& result)
{
/*if (result == NULL)
exit(-1);*/
if (result._cols != this->_cols || result._rows != this->_rows)
exit(-1);
// Can't pow the matrix, return mat of '0' values
if (this->_cols != this->_rows)
{
for (int i = 0; i < result._rows; i++)
for (int j = 0; j < result._cols; j++)
result.setElement(i, j, 0);
return;
}
/*if (power == 0)
result = 1;*/
double sum = 0;
Matrix temp(this->_rows, this->_cols);
// Copy this matrix to result matrix
for (int i = 0; i < this->_rows; i++)
for (int j = 0; j < this->_cols; j++)
result.setElement(i, j, this->_array[i][j]);
// Pow loop
for (int p = 1; p < power; p++)
{
for (int i = 0; i < this->_rows; i++)
for (int j = 0; j < this->_cols; j++)
{
for (int k = 0; k < this->_rows; k++)
sum += this->getElement(i, k) * result.getElement(k, j);
temp.setElement(i ,j ,sum);
sum = 0;
}
// Copy temp array to result array
for (int i = 0; i < this->_rows; i++)
for (int j = 0; j < this->_cols; j++)
result.setElement(i, j, temp.getElement(i, j));
for (int i = temp._rows; i >= 0; i--)
delete[] temp._array[i];
delete[] temp._array;
}
}
主:
void main()
{
int rows = 3, cols = 3;
Matrix m1(rows, cols);
Matrix other(rows, cols);
Matrix result(rows, cols);
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
{
m1.setElement(i, j, i + j);
other.setElement(i, j, 3 * (i + j + 1));
}
m1.pow(3, result);
}
SetElements:
void Matrix::setElement(int i, int j, double data)
{
if (i < 0 || j < 0)
exit(-1);
if (i >= this->_rows || j >= this->_cols)
exit(-1);
_array[i][j] = data;
}
感谢
答案 0 :(得分:0)
1)准备一个对象不再存在的成员函数这个词是析构函数,而不是分心者。
2)如果你是运算符new
的数组形式,使用非数组形式的运算符delete
- 你是 - 给出了未定义的行为。请改用运算符delete
的数组形式。
3)如图所示,您的代码使用了您未提供的其他功能。任何这些,如果实现不正确,可能对指针执行无效操作,因此是导致崩溃的其他原因。
4)不要使用动态内存分配(运算符new
等)来处理动态分配的数组。您已证明这样做容易出错。如果您想要动态分配double
数组,请使用std::vector<double>
。如果您想要一个double
的二维数组,请使用std::vector<std::vector<double> >
。除了不易出错之外,std::vector
正确地释放其内存(只要你不写一些其他代码来破坏内存)。
答案 1 :(得分:0)
在Matrix
中,您可以分配新数组:
...
this->_array = new double*[rows]; // <== array of pointers
for (int i = 0; i < rows; i++)
this->_array[i] = new double[cols]; // <== arrays of doubles
...
但是在你的析构函数中你删除了元素。您必须更正此问题:每次您分配数组(new []
)时,您必须delete the array(delete []
),否则您将获得未定义的行为(例如崩溃):
for (int i = 0; i < _rows; i++)
delete[] _array[i]; // <== delete array, not element!!
delete[] _array; // <== delete array, not element!!
注意: 每当您想要使用新/删除时,您应该问自己,它是否值得考虑使用向量代替。这很简单,因为online demo显示代码重做
pow()
:在这里创建矩阵对象temp
:
Matrix temp(this->_rows, this->_cols);
此对象将在函数pow()
的末尾自动销毁。这意味着它的析构函数将调用所有必需的delete[]
。
问题是在函数结束时,你手动完成析构函数的工作,所以你delete[]
临时数组。然后析构函数尝试删除已删除的对象。这是未定义的行为,因此崩溃!
你所要做的就是摆脱pow()
的最后3行以及它们包含的不必要的delete[]
。