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);