矩阵类操作符重载,析构函数问题



我试图写一个矩阵类,它将能够找到逆,伴随,等。任意阶的方阵。构造函数初始化一个n阶的单位矩阵(传递给它)。

class Matrix
{
int** elements;
int order;
public:
Matrix& operator=(const Matrix& second_inp)
{
    if(this->order!=second_inp.order)
        cout<<"The matrix cannot be assigned!!!n"<<this->order<<"n"<<second_inp.order;
    else
    {
        for(int i=0;i<this->order;i++)
            for(int j=0;j<this->order;j++)
                this->elements[i][j] = second_inp.elements[i][j];
    }
    return *this;
}
Matrix operator*(const Matrix& a)const
{
    Matrix c(a.order);
    for(int i=0;i<c.order;i++)                      
        for(int j=0;j<c.order;j++)
            c.elements[i][j]=0;
    if (this->order!=a.order)
    {
        cout<<"The 2 Matrices cannot be multiplied!!!n";
        return Matrix();
    }
    else
    {
        for(int i=0;i<a.order;i++)
            for(int j=0;j<a.order;j++)
                for(int k=0;k<a.order;k++)
                    c.elements[i][j] += (this->elements[i][k])*(a.elements[k][j]);
        return c;
    }
}
};
~Matrix()
{
    for(int i=0;i<this->order;i++)
        delete[] *(elements+i);
    delete[] elements;
    elements=nullptr;
}

如果我要使用这个类运行以下代码:

Matrix exp1(2),exp2(2),exp3(2);
exp1.get_matrix();
exp3=exp1*exp2;
exp3.show_matrix();

我得到一个运行时错误,而调试我发现,在乘法(exp1*exp2)后,=运算符不能访问数据,如果*运算符的结果。

但是,如果我在main()的末尾使用像这样的手动析构函数来释放所有分配的内存,程序就会正常工作。

void destroctor()
{
  for(int i=0;i<order;i++)
    delete[] *(elements+i);
  delete[] elements;
}

如何编辑析构函数或操作符重载来纠正这个问题?

使用的构造函数:

Matrix(int inp_order):order(inp_order)
{
    elements=new int*[order];
    for(int i=0;i<order;i++)
        *(elements+i)=new int[order];
    for(int i=0;i<order;i++)
        for(int j=0;j<order;j++)
        {
            if (i==j)
                *(*(elements+j)+i)=1;
            else
                *(*(elements+j)+i)=0;
        }
}

很难知道哪里出了问题,因为您没有发布您的构造函数。

exp3=exp1*exp2;中发生了很多事情:

首先在operator*函数中构造一个新的矩阵c。然后是return c;语句先调用复制构造函数,然后调用析构函数。之后调用operator=,然后再次调用临时矩阵的析构函数。

我认为发生的事情是你使用了默认的复制构造函数,它不进行深度复制。这样,在return c时调用的析构函数删除了仍然在矩阵之间共享的数据。

我得到一个运行时错误,而调试我发现,在乘法(exp1*exp2)后,=运算符不能访问数据,如果*运算符的结果。

你没有告诉我们你的构造函数,所以没有办法告诉你为什么你得到这个错误。

我怀疑原因是您没有分配包含矩阵所需的内存。您将其声明为int**,因此需要分配一个int*指针数组,并且需要为每个int分配一个数组。

编辑
当我输入这个时,你发布了构造函数的代码。

您没有从operator*的重载返回值,并且您没有复制构造函数(三规则)。

是否启用了编译器警告?任何称职的编译器都会抱怨操作符重载中缺少return语句。

您还没有定义复制构造函数,所以编译器将为您生成一个。为了将operator*(const & Matrix a)的返回值复制到结果中,将调用该构造函数。

由于生成的复制构造函数只执行浅成员复制,它不会分配新的元素数组,因此出现错误。

最新更新