急求学C++的帮忙改错,运算符重载问题,主要是释放内存的问题, 我邮箱 1053337551@qq.com
#include<stdio.h>classMatrix{public:Matrix(intr,intc);Matrix(double*a,intr,intc);~Mat...
#include<stdio.h>
class Matrix
{
public:
Matrix(int r,int c);
Matrix(double *a,int r,int c);
~Matrix();
void Display(); //显示
Matrix &operator =(Matrix &B); //"="
Matrix operator +(const Matrix &B)const; //"+"
private:
double *array;
int row;
int column;
};
int main()
{
double a[12]={1.2,13,43,45,67,67.8,43.5,76.5,676.8,23,58.6,9.8};
double b[12]={1.5,14,45,35,56.7,69.8,43.5,76.5,76.8,23.8,59.6,9.8};
Matrix A(a,3,4),B(b,3,4),C(1,2);
A.Display(); printf("\n");
B.Display(); printf("\n");
C.Display(); printf("\n");
C=A;
C.Display(); printf("\n");
C=A+B;//加号重载有问题
C.Display(); printf("\n");
return 0;
}
Matrix::Matrix(int r,int c)
{
array=NULL;
row=r;
column=c;
if(r>0&&c>0)
{
array= new double[r*c];
for(int i=0;i<r*c;i++)
array[i]=0;
}
}
Matrix::Matrix(double *a,int r,int c)
{
int i,j;
row=r;
column=c;
array=NULL;
if(r>0&&c>0)
{
array= new double[r*c];
for(i=0;i<r;i++)
for(j=0;j<c;j++)
array[i*c+j]=a[i*c+j];
}
}
Matrix::~Matrix()
{
if(array!=NULL)
{
delete [] array;
}
}
void Matrix::Display()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
printf("%6.2lf ",array[i*column+j]);
printf("\n");
}
}
Matrix &Matrix::operator =(Matrix &B)
{
int i;
if(this==&B)
return *this;
delete []array;
row=B.row;
column=B.column;
array=new double[row*column];
for(i=0;i<row*column;i++)
array[i]=B.array[i];
return *this;
}
Matrix Matrix::operator +(const Matrix &B)const
{
if(row!=B.row||column!=B.column)
{
printf("!!!!");
}
Matrix C(row,column);
for(int i=0;i<row*column;i++)
C.array[i]=array[i]+B.array[i];
return C;
}
好像是重复释放了内存的问题,不知道为什么会这样,这个问题一直困扰着我,现在我茶不思饭不想,再不帮我就解决我就要额饿死了。。。跪求好心人 展开
class Matrix
{
public:
Matrix(int r,int c);
Matrix(double *a,int r,int c);
~Matrix();
void Display(); //显示
Matrix &operator =(Matrix &B); //"="
Matrix operator +(const Matrix &B)const; //"+"
private:
double *array;
int row;
int column;
};
int main()
{
double a[12]={1.2,13,43,45,67,67.8,43.5,76.5,676.8,23,58.6,9.8};
double b[12]={1.5,14,45,35,56.7,69.8,43.5,76.5,76.8,23.8,59.6,9.8};
Matrix A(a,3,4),B(b,3,4),C(1,2);
A.Display(); printf("\n");
B.Display(); printf("\n");
C.Display(); printf("\n");
C=A;
C.Display(); printf("\n");
C=A+B;//加号重载有问题
C.Display(); printf("\n");
return 0;
}
Matrix::Matrix(int r,int c)
{
array=NULL;
row=r;
column=c;
if(r>0&&c>0)
{
array= new double[r*c];
for(int i=0;i<r*c;i++)
array[i]=0;
}
}
Matrix::Matrix(double *a,int r,int c)
{
int i,j;
row=r;
column=c;
array=NULL;
if(r>0&&c>0)
{
array= new double[r*c];
for(i=0;i<r;i++)
for(j=0;j<c;j++)
array[i*c+j]=a[i*c+j];
}
}
Matrix::~Matrix()
{
if(array!=NULL)
{
delete [] array;
}
}
void Matrix::Display()
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<column;j++)
printf("%6.2lf ",array[i*column+j]);
printf("\n");
}
}
Matrix &Matrix::operator =(Matrix &B)
{
int i;
if(this==&B)
return *this;
delete []array;
row=B.row;
column=B.column;
array=new double[row*column];
for(i=0;i<row*column;i++)
array[i]=B.array[i];
return *this;
}
Matrix Matrix::operator +(const Matrix &B)const
{
if(row!=B.row||column!=B.column)
{
printf("!!!!");
}
Matrix C(row,column);
for(int i=0;i<row*column;i++)
C.array[i]=array[i]+B.array[i];
return C;
}
好像是重复释放了内存的问题,不知道为什么会这样,这个问题一直困扰着我,现在我茶不思饭不想,再不帮我就解决我就要额饿死了。。。跪求好心人 展开
3个回答
展开全部
错误在于你并未完全理解当函数返回一个对象时再赋值给其他对象情况。
如你的:C=A+B;//
具体步骤是:
1.调用operator+函数,你这里返回了一个局部对象
2.将局部对象的值赋值给一块临时对象,所以关键就是在这里,你错误
根源也在此,这儿创建一个临时对象Matrix temp=A.operator+(B),调用
了拷贝构造函数,而你在类中并未定义拷贝函数,所以无法完成深复制,
导致会再次析构已经释放的内存空间。
3.调用重载的=操作符
所以你可以在类中添加一个赋值拷贝就可以了:
Matrix(const Matrix &B)
{
row=B.row;
column=B.column;
array=new double[B.row * B.column];
for(int i=0;i<B.row * B.column;i++)
array[i]=B.array[i];
}
如你的:C=A+B;//
具体步骤是:
1.调用operator+函数,你这里返回了一个局部对象
2.将局部对象的值赋值给一块临时对象,所以关键就是在这里,你错误
根源也在此,这儿创建一个临时对象Matrix temp=A.operator+(B),调用
了拷贝构造函数,而你在类中并未定义拷贝函数,所以无法完成深复制,
导致会再次析构已经释放的内存空间。
3.调用重载的=操作符
所以你可以在类中添加一个赋值拷贝就可以了:
Matrix(const Matrix &B)
{
row=B.row;
column=B.column;
array=new double[B.row * B.column];
for(int i=0;i<B.row * B.column;i++)
array[i]=B.array[i];
}
追问
高手啊!!!非常感谢啊!!!可惜分数已经提到最高了,加不了啊,要不然再给你加300分
展开全部
用VS 2005调试了一下,是在C=A+B这行出错,不过用F10跳转进去看,实际出错的地方是在A+B计算完毕以后,赋值操作结束以后,临时对象析构的时候,调用了析构时候释放数组出错了。还没看出来咋该....研究中....
Matrix::~Matrix()
{
if(array!=NULL)
{
delete [] array; //在这个地方异常了。
}
}
Matrix::~Matrix()
{
if(array!=NULL)
{
delete [] array; //在这个地方异常了。
}
}
更多追问追答
追问
就是这个问题啊,不知道怎么搞的,多谢啊,耐心等待中。。。
追答
增加调试信息看了一下,加号重载里边的C是临时变量,在退出加号重载函数的时候,C已经析构过一次了,虽然析构了,但是array的指针式指向了一个未知地址,因此不为空。所以在再次进入析构的时候,array != NULL成立,进行了二次删除,所以有问题。
array在析构以后增加一个array = null的语句,把array显示置成空。不过返回的数组已经是无效的了。具体咋解决,等有空了再帮你看,因为有事要出去了,不好意思啊。希望有其他高手能一下帮你搞定:)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
释放内存改成delete array
追问
谢谢,还是不行,我这是释放数组
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询