函数返回局部对象

yuman_0118 2012-04-26 04:49:56
//构造一个n*n的单位矩阵
Matrix::Matrix(unsigned long n)
{
m_row=n;
m_column=n;

m_p=new double[n*n]; //申请n*n的空间

for(unsigned long i=0;i!=m_row;++i)
{
for(unsigned long j=0;j!=m_column;++j)
{
if(i==j)
*(m_p+m_column*i+j)=1.0;
else
*(m_p+m_column*i+j)=0.0;
}
}

}

//析构函数
Matrix::~Matrix()
{
delete []m_p;
}

Matrix& Matrix::operator*(Matrix& mat2)
{
assert(m_column==mat2.m_row);

Matrix res(m_row,mat2.m_column);
for(unsigned long i=0;i!=m_row;++i)
{
for(unsigned long j=0;j!=mat2.m_column;++j)
{
*(res.m_p+res.m_column*i+j)=0.0;
for(unsigned long t=0;t!=m_column;++t)
*(res.m_p+res.m_column*i+j)+=*(m_p+m_column*i+t)*mat2[t][j];
}
}

return res;
}


在重载*的函数中创建一个Matrix对象,最后返回该对象,当函数结束Matrix对象销毁时,对象的数据成员m_p被释放,它里边的内容就会不存在了,这个问题应该怎么解决???
...全文
117 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ohayou 2012-04-27
  • 打赏
  • 举报
回复
解决就好。注意结贴率
hen_hao_ji 2012-04-26
  • 打赏
  • 举报
回复
对的,你的分析
[Quote=引用 4 楼 的回复:]
引用 1 楼 的回复:
1 成员的operator*应当返回类的实例而不是引用。
2 有自己分配管理的内存的类应当正确地定义拷贝构造和赋值。如果支持C++11,为了更高效率应当同时定义移动构造和赋值。

我已经解决了,定义了拷贝构造函数就行了,定义拷贝构造函数这么重要吗?谢谢了
是不是因为返回局部对象时,需要将局部对象复制给临时的寄存器,对象中含有自己分配的内存,如果仅采用默认的拷贝函数……
[/Quote]
yuman_0118 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
1 成员的operator*应当返回类的实例而不是引用。
2 有自己分配管理的内存的类应当正确地定义拷贝构造和赋值。如果支持C++11,为了更高效率应当同时定义移动构造和赋值。
[/Quote]
我已经解决了,定义了拷贝构造函数就行了,定义拷贝构造函数这么重要吗?谢谢了
是不是因为返回局部对象时,需要将局部对象复制给临时的寄存器,对象中含有自己分配的内存,如果仅采用默认的拷贝函数是不行的啊?
W170532934 2012-04-26
  • 打赏
  • 举报
回复
Matrix res=new Matrix(m_row,mat2.m_column);
将res的内存空间从栈上转移到堆空间中。堆空间的内存由用户自行控制。
evencoming 2012-04-26
  • 打赏
  • 举报
回复
不返回引用.
返回一个实体.
ohayou 2012-04-26
  • 打赏
  • 举报
回复
1 成员的operator*应当返回类的实例而不是引用
2 有自己分配管理的内存的类应当正确地定义拷贝构造和赋值。如果支持C++11,为了更高效率应当同时定义移动构造和赋值

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧