函数返回局部对象解决方案
函数返回局部对象
//构造一个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被释放,它里边的内容就会不存在了,这个问题应该怎么解决???
------解决方案--------------------
1 成员的operator*应当返回类的实例而不是引用。
2 有自己分配管理的内存的类应当正确地定义拷贝构造和赋值。如果支持C++11,为了更高效率应当同时定义移动构造和赋值。
------解决方案--------------------
Matrix res=new Matrix(m_row,mat2.m_column);
将res的内存空间从栈上转移到堆空间中。堆空间的内存由用户自行控制。
------解决方案--------------------
对的,你的分析
//构造一个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被释放,它里边的内容就会不存在了,这个问题应该怎么解决???
------解决方案--------------------
1 成员的operator*应当返回类的实例而不是引用。
2 有自己分配管理的内存的类应当正确地定义拷贝构造和赋值。如果支持C++11,为了更高效率应当同时定义移动构造和赋值。
------解决方案--------------------
Matrix res=new Matrix(m_row,mat2.m_column);
将res的内存空间从栈上转移到堆空间中。堆空间的内存由用户自行控制。
------解决方案--------------------
对的,你的分析