C++ 如何正确返回矩阵乘法结果
我有一门布尔矩阵的课。 在析构函数中释放内存不能正常工作,它试图删除无效的指针——正如我注意到的,当我尝试乘法时会发生这种情况 在operator*中,我返回本地对象作为结果,该部分导致无效指针-因此在析构函数中删除时程序崩溃-问题是为什么在这段代码中会发生这种情况?如何正确返回结果? 代码如下:C++ 如何正确返回矩阵乘法结果,c++,pointers,operator-overloading,C++,Pointers,Operator Overloading,我有一门布尔矩阵的课。 在析构函数中释放内存不能正常工作,它试图删除无效的指针——正如我注意到的,当我尝试乘法时会发生这种情况 在operator*中,我返回本地对象作为结果,该部分导致无效指针-因此在析构函数中删除时程序崩溃-问题是为什么在这段代码中会发生这种情况?如何正确返回结果? 代码如下: #include <iostream> using namespace std; class BoolMatrix { private: b
#include <iostream>
using namespace std;
class BoolMatrix
{
private:
bool ** items;
public:
size_t rows, cols;
BoolMatrix(size_t = 0, size_t = 0);
~BoolMatrix();
BoolMatrix operator * (const BoolMatrix &) const;
//some other members
};
BoolMatrix::BoolMatrix(size_t r, size_t c) : rows(r), cols(c)
{
items = new bool*[r];
for (size_t i = 0; i < r; i++)
{
items[i] = new bool[c];
for (size_t j = 0; j < c; j++)
items[i][j] = 0;
}
}
BoolMatrix::~BoolMatrix()
{
if (items)
{
for (size_t i = 0; i < rows; i++)
{
if (items[i])
delete[] items[i];
items[i] = NULL;
}
delete[] items;
items = NULL;
}
}
BoolMatrix BoolMatrix::operator * (const BoolMatrix& that) const
{
//NxM * MxK = NxK
if (cols != that.rows)
return NULL;
Matrix res(rows, that.cols);
for (size_t i = 0; i < rows; i++)
{
for (size_t j = 0; j < that.cols; j++)
for (size_t l = 0; l < that.rows; l++)
res.items[i][j] = (res.items[i][j] + items[i][l]*that.items[l][j]) != 0;
}
return res;
}
int main(int argc, char *argv[])
{
size_t n;
cin >> n;
BoolMatrix a(n, n);
//matrix reading code
a*a;
return 0;
}
感谢重载“=”操作符并像a=a*a一样使用它;而析构函数必须是
BoolMatrix::~BoolMatrix()
{
for (size_t i = 0; i < rows; i++)
{
delete [] items[i];
}
delete[] items;
}
}
重载复制构造函数来复制整个数组,因此当函数删除它的类的本地实例时,它将删除它自己的矩阵,而main中的函数将有它的矩阵副本注意,如果你这样离开它,你从main中得到的函数和变量的结果在main中等于函数的结果,指向完全相同的内存,这就是为什么您需要复制构造函数的原因。我认为发生的情况是您试图删除堆栈上的[]内存 而不是
Matrix res(rows, that.cols);
试一试
Matrix res=new Matrix(rows, that.cols);
为什么不使用向量呢?是的,没错,我忘了我使用指针是为了共享它们,我认为使用布尔向量作为堆栈也是另一种解决方案。谢天谢地,我只是在堆栈上使用bool vector,但没有在heapTried中使用它来编写复制构造函数,但是想不出任何正确的复制构造函数来解决无效指针的问题boolmatrix::BoolMatrixother&t{rows=t.rows;cols=t.cols items=new bool*[rows];对于大小I=0;I