C++ 使用delete正在使我的程序崩溃
当我试图删除分心器上的指针时,我的程序正在崩溃,为什么? 我不明白我在代码中做错了什么 我使用新的错误吗 类别矩阵:C++ 使用delete正在使我的程序崩溃,c++,C++,当我试图删除分心器上的指针时,我的程序正在崩溃,为什么? 我不明白我在代码中做错了什么 我使用新的错误吗 类别矩阵: class Matrix { private: double **_array; int _rows, _cols; ... Matrix::Matrix(int rows, int cols) { if (rows <= 0 || cols <= 0) exit(-1); thi
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;
}
类矩阵
{
私人:
双**阵列;
整数行,整数列;
...
矩阵::矩阵(int行,int列)
{
if(行_数组[i]=新的双精度[cols];
此->\u行=行;
这个->\u 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矩阵::pow(整数幂、矩阵和结果)
{
/*如果(结果==NULL)
出口(-1)*/
如果(结果。|列!=此->|列|结果。|列!=此->|列)
出口(-1);
//无法对矩阵进行pow,返回“0”值的mat
如果(此->\u列!=此->\u行)
{
对于(int i=0;i\u行,此->\u列);
//将此矩阵复制到结果矩阵
对于(int i=0;i\u行;i++)
对于(int j=0;j\u cols;j++)
setElement(i,j,this->_数组[i][j]);
//功率环
for(int p=1;p\u行;i++)
对于(int j=0;j\u cols;j++)
{
对于(int k=0;k\u行;k++)
sum+=this->getElement(i,k)*result.getElement(k,j);
温度设定元件(i,j,和);
总和=0;
}
//将临时数组复制到结果数组
对于(int i=0;i\u行;i++)
对于(int j=0;j\u cols;j++)
result.setElement(i,j,temp.getElement(i,j));
对于(int i=temp.\u行;i>=0;i--)
删除[]临时数组[i];
删除[]临时数组;
}
}
主要内容:
void main()
{
int行=3,cols=3;
矩阵m1(行、列);
矩阵其他(行、列);
矩阵结果(行、列);
对于(int i=0;i
集合元素:
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;
}
void矩阵::setElement(int i,int j,双数据)
{
if(i<0 | | j<0)
出口(-1);
如果(i>=this->| | j>=this->| cols)
出口(-1);
_数组[i][j]=数据;
}
感谢1)让对象不复存在的成员函数是析构函数,而不是干扰物
2) 如果您选择运算符new
的数组形式,则使用运算符delete
的非数组形式(您现在使用的形式)会给出未定义的行为。请改用运算符delete
的数组形式
3) 如图所示,您的代码使用了您未提供的其他函数。如果这些函数实现不正确,则可能对指针执行无效操作,因此可能是导致崩溃的其他原因
4) 不用麻烦使用动态内存分配(操作员
新建等)使用动态分配的数组。您已经证明这样做容易出错。如果您想要动态分配的double
数组,请使用std::vector
。如果您想要double
二维数组,请使用std::vector
。除了不太容易出错之外,还可以使用std::vector代码>正确释放其内存(只要您不编写其他会破坏内存的代码)。在矩阵中,您可以分配新数组:
...
this->_array = new double*[rows]; // <== array of pointers
for (int i = 0; i < rows; i++)
this->_array[i] = new double[cols]; // <== arrays of doubles
...
<强>注:每当你想使用NeX/Delphi时,你应该问问自己,如果它不值得考虑使用矢量。这很容易,因为这个代码重新修改了
编辑:您的问题与pow()
:
在此创建矩阵对象temp
:
Matrix temp(this->_rows, this->_cols);
此对象将在函数pow()
结束时自动析构函数。这意味着其析构函数将调用所有必要的delete[]
问题是,在函数结束时,您手动执行析构函数的工作,因此您delete[]
temp的数组。然后析构函数尝试删除已删除的对象。这是未定义的行为,因此会导致崩溃
你所要做的就是去掉pow()的最后3行和不必要的delete[]
它们包含。另一方面,不需要这些this->
s。编译器知道代码正在处理成员。代码段不包括setElement
成员函数。问题可能就在这里。正如其他人所说,代码应该使用delete[]< /COD> >而不是<代码>删除>代码>,但对于标量类型<代码>删除>代码>通常是有效的。在类代码的中间调用<代码>退出()/代码>不是一种习惯。在这里的代码中,假设“代码>删除<代码>已更改为<代码>删除[]。
在两个地方,没有发生崩溃的原因。因此,您正在测试的代码必须与您正在显示的代码不同。@zcbd这里没有问题:我按照您所说的那样更改了它,但仍然存在崩溃问题。请在我的代码中的另一个地方查找问题。。抱歉。将其添加到topicok的顶部!好消息。我正要向您建议请将您的矩阵更改为使用向量,这可能会揭示此类问题(请参见编辑的注释)。好的!没问题;-)与您的问题无关,但如果您感兴趣,您可以考虑将丑陋的出口(-1)替换为。为什么与我的问题无关?您是否查看更新的主题?谢谢您的帮助!
for (int i = 0; i < _rows; i++)
delete[] _array[i]; // <== delete array, not element!!
delete[] _array; // <== delete array, not element!!
Matrix temp(this->_rows, this->_cols);