急!!!怎样在函数体内将一个临时申请的对象作为返回值传出?

RateRiver 2008-04-14 01:37:31
本人在毕业设计中用C++实现一个算法遇到了一点小问题,大致问题描述就是:怎样在函数体内将一个临时申请的对象作为返回值传出.我卡在这个问题上停滞不前,求各位高手帮我提出一点解决办法,下面是我将主要问题突出的一段简化的代码,程序运行时报了内存出错,大家帮我看看怎样改正一下,谢谢了!!!
matrix.h头文件如下:
class matrix{
public:
matrix(double**,int,int);
matrix();
~matrix();
matrix operator+(matrix &s);//重载两个数组相加
private:
double** p;//指向二维数组的二维指针
int m,n;//m为二维数组的行数,n为二维数组的列数
};
matrix.cpp文件如下:
#include"matrix.h"
#include<iostream.h>
matrix::matrix(double **A,int k,int l)
{
m=k;
n=l;
p=new double*[m];
for(int i=0;i<m;i++)
p[i]=new double[n];
for(i=0;i<m;i++)
for(int j=0;j<n;j++)
p[i][j]=A[i][j];
}
matrix::~matrix()
{
for (int i = 0; i < m; i++)
delete [n]p[i];
delete [m] p;
m=n=0;
}
matrix matrix::operator+(matrix &s)
{
if(s.m==m&&s.n==n)
{
double **r;
r=new double*[m];
for(int i=0;i<m;i++)
r[i]=new double[n];
for(i=0;i<m;i++)
for(int j=0;j<n;j++)
r[i][j]=p[i][j]+s.p[i][j];
matrix sum(r,m,n);
return sum;
}
else
cout<<"error!两个数组不能相加"<<endl;
return *this;

}
main主函数如下:
#include"matrix.h"
#include<iostream.h>
int main()
{
double **a,**b;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
a[i][j]=2;
for(i=0;i<4;i++)
for(int j=0;j<4;j++)
b[i][j]=2;
matrix amatrix(a,4,4),bmatrix(b,4,4);
amatrix+bmatrix;
return 0;
}
由于操作数组比较大,所以用的是二维指针,大家帮忙看下,由于毕业设计时间比较紧,请各位早点答复,再次谢谢大家了!!!
...全文
174 18 打赏 收藏 举报
写回复
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
RateRiver 2008-04-14
  • 打赏
  • 举报
回复
我同学帮我改了一下,可以了,大家看看:
matrix matrix::operator+(matrix &s)
{
if(s.m==m&&s.n==n)
{
double **r;
r=new double*[m];
for(int i=0;i <m;i++)
r[i]=new double[n];
for(i=0;i <m;i++)
for(int j=0;j <n;j++)
r[i][j]=p[i][j]+s.p[i][j];
return matrix(r,m,n);
}
else
cout <<"error!两个数组不能相加"<<endl;
return *this;
}
这样改了后不错
qmm161 2008-04-14
  • 打赏
  • 举报
回复
已经在聊天窗口回复你了
yaoqian156 2008-04-14
  • 打赏
  • 举报
回复
楼主你的方法并不是产生了内存泄漏,而是对同一块内存delete了2次,matrix sum(r,m,n)是一个内部对象,它的生存期在该函数结束时候就已经结束,会自动调用析构函数。不过在析构它之前,程序会创建一个临时对象把它拷贝进去,因为你没有写自己的拷贝构造函数,所以会是位拷贝,临时对象所指的内存和matrix sum(r,m,n)是同一块
,当析构这个临时对象的时候,它所指向的内存即matrix sum(r,m,n)已经被析构调了,为0X00000000了,空指针,程序挂掉。
yaoqian156 2008-04-14
  • 打赏
  • 举报
回复
只针对你这种情况,现把+函数修改如下:
matrix& matrix::operator+(matrix &s)
{
if(s.m==m&&s.n==n)
{
double **r;
r=new double*[m];
for(int i=0;i <m;i++)
r[i]=new double[n];
for(i=0;i <m;i++)
for(int j=0;j <n;j++)
r[i][j]=p[i][j]+s.p[i][j];
static matrix sum(r,m,n); //声明为静态对象,返回为它的引用
for (i = 0; i < m; i++)
delete [n]r[i];
delete [m] r;
return sum;
}
else
{
cout <<"error!两个数组不能相加" <<endl;
return *this;
}

}

一般情况下不推荐使用这种方式,具体原因请参考《Effective C++》中解释...我现在手中没有资料



RateRiver 2008-04-14
  • 打赏
  • 举报
回复
根据大家的意见修改了,可还是有问题啊,大家再帮忙看看:
matrix.h:
class matrix{
public:
matrix(double**,int,int);
matrix(matrix& it)
{
matrix(it.p, it.m, it.n);
}

matrix();
~matrix();
matrix operator+(matrix &s);//重载两个数组相加
private:
double** p;//指向二维数组的二维指针
int m,n;//m为二维数组的行数,n为二维数组的列数
};
mtrix.cpp:
#include"matrix.h"
#include <iostream.h>
matrix::matrix(double **A,int k,int l)
{
m=k;
n=l;
p=new double*[m];
for(int i=0;i <m;i++)
p[i]=new double[n];
for(i=0;i <m;i++)
for(int j=0;j <n;j++)
p[i][j]=A[i][j];
}
matrix::~matrix()
{
for (int i = 0; i < m; i++)
delete [n]p[i];
delete [m] p;
m=n=0;
}
matrix matrix::operator+(matrix &s)
{
if(s.m==m&&s.n==n)
{
double **r;
r=new double*[m];
for(int i=0;i <m;i++)
r[i]=new double[n];
for(i=0;i <m;i++)
for(int j=0;j <n;j++)
r[i][j]=p[i][j]+s.p[i][j];
matrix sum(r,m,n);
for (i = 0; i < m; i++)
delete [n]r[i];
delete [m] r;
return sum;
}
else
cout <<"error!两个数组不能相加"<<endl;
return *this;

}
主函数:
#include"matrix.h"
#include <iostream.h>
int main()
{
double **a,**b;
a=new double*[4];
for(int i=0;i <4;i++)
a[i]=new double[4];
b=new double*[4];
for(i=0;i <4;i++)
b[i]=new double[4];
for( i=0;i <4;i++)
for(int j=0;j <4;j++)
a[i][j]=2;
for(i=0;i <4;i++)
for(int j=0;j <4;j++)
b[i][j]=2;
matrix amatrix(a,4,4),bmatrix(b,4,4);
amatrix+bmatrix;
for ( i = 0; i < 4; i++)
delete [4]a[i];
delete [4] a;
for ( i = 0; i < 4; i++)
delete [4]b[i];
delete [4] b;
return 0;
}

yaoqian156 2008-04-14
  • 打赏
  • 举报
回复
同意楼上,9楼+函数返回*this引用,覆盖了数组中原来的内容...
RateRiver 2008-04-14
  • 打赏
  • 举报
回复
+函数返回this指针的话,amatrix+bmatrix,本对象amatrix原来的内容就没有了吧?
xkyx_cn 2008-04-14
  • 打赏
  • 举报
回复
mark
RateRiver 2008-04-14
  • 打赏
  • 举报
回复
那我+函数的内存在什么时候释放比较合适呢
baihacker 2008-04-14
  • 打赏
  • 举报
回复

//虽然改造了很多但是还有很多问题
#include <iostream>
using namespace std;

class matrix{
public:
matrix(double*,int,int);
matrix(matrix& it)
{
matrix(it.p, it.m, it.n);
}
~matrix();
matrix& operator+(matrix &s);//重载两个数组相加
double& at(int x, int y){return p[x*n+y];}
int row()const{return m;}
int col()const{return n;}
friend ostream& operator<<(ostream& o, matrix& m);
private:
double* p;
int m,n;
};
matrix::matrix(double* A,int k,int l)
{
m=k;
n=l;
p=new double[m*n];
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
p[n*i+j]=A[n*i+j];
}
matrix::~matrix()
{
delete [] p;
m=n=0;
}
matrix& matrix::operator+(matrix &s)
{
if(s.m==m&&s.n==n)
{
for(int i=0;i <m;i++)
for(int j=0;j <n;j++)
p[i*n+j]+=s.p[i*n+j];
}
else
cout <<"error!两个数组不能相加" <<endl;
return *this;

}

ostream& operator<<(ostream& o, matrix& m)
{
for (int i = 0; i < m.row(); (o << endl), ++i)
for (int j = 0; j < m.col(); ++j)
o << m.at(i, j) << '\t';
return o;
}
int main()
{
double a[]={2,2,2,2,
2,2,2,2,
2,2,2,2,
2,2,2,2};
matrix amatrix(a,4,4),bmatrix(a,4,4);
cout << (amatrix +bmatrix);
cin.get();
return 0;
}
4 4 4 4
4 4 4 4
4 4 4 4
4 4 4 4


myullian 2008-04-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 Inhibitory 的回复:]
int main()
{
double **a,**b;
for(int i=0;i <4;i++)
for(int j=0;j <4;j++)
a[i][j]=2; // a还没有分配内存空间就直接使用, 当然出问题
for(i=0;i <4;i++)
for(int j=0;j <4;j++)
b[i][j]=2; // b与a犯同样的错误.
matrix amatrix(a,4,4),bmatrix(b,4,4);// error
amatrix+bmatrix;
return 0;
}
[/Quote]
qmm161 2008-04-14
  • 打赏
  • 举报
回复
靠,都到6楼了,csdn里面拿个分真不容易
qmm161 2008-04-14
  • 打赏
  • 举报
回复
operator + 一般不作为成员,而是以友元方式存在;

而且+的内部实现存在内存泄漏的问题!

再而且你采用的返回值的方式,那么返回的是一个复本,你有定义拷贝构造函数吗?(相信这点是你程序报错的主要原因)
Inhibitory 2008-04-14
  • 打赏
  • 举报
回复
int main()
{
double **a,**b;
for(int i=0;i <4;i++)
for(int j=0;j <4;j++)
a[i][j]=2; // a还没有分配内存空间就直接使用, 当然出问题
for(i=0;i <4;i++)
for(int j=0;j <4;j++)
b[i][j]=2; // b与a犯同样的错误.
matrix amatrix(a,4,4),bmatrix(b,4,4);// error
amatrix+bmatrix;
return 0;
}
babyvox1999 2008-04-14
  • 打赏
  • 举报
回复
返回指针的话就用动态分配内存
星羽 2008-04-14
  • 打赏
  • 举报
回复
对应着你的代码的哪个函数你总得说说啊
clhposs 2008-04-14
  • 打赏
  • 举报
回复
返回非引用的对象是申请临时空间复制
jieao111 2008-04-14
  • 打赏
  • 举报
回复
怎样在函数体内将一个临时申请的对象作为返回值传出

返回对象不就行了吗
相关推荐
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-04-14 01:37
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下