返回对动态分配对象的引用

时间:2013-07-01 19:48:52

标签: c++ reference return

我有以下例子来说明我的问题 我有类Matrix

class Matrix{


   private:

      int *array;
      int x;
      int y;

   public:

      //some other things..
      Matrix& operator+(Matrix& add);
      Matrix& operator=(Matrix& matr);

}

我希望operator +返回一个全新的对象,该对象将分配给Matrix对象,不是对Matrix的引用,也不是指向Matrix的指针。 因此operator =只需要逐位复制值。

(我知道Matrix类的这个实现并不好,但我这样做是为了说明我的问题)

现在问题是operator +

的实现

首先,我尝试在重载函数中创建一个像这样的对象

Matrix sum;
//do what i have to do and then
return sum;

但是这会带来问题,因为对象总和当然会被破坏,而Matrix的析构函数当然会

 delete [] array;    

另一种方法是创建

Matrix *sum;

sum = new Matrix;

sum->array = new int[//size that i need];
//do what i have to do

return *sum;

所以现在主要是

C=A+B;  

(A,B,C是矩阵对象)

A + B返回对堆中对象的新创建的引用。 此对象将被分配给C,并且将逐位复制.C将具有正确的x值,正确的y值和C->数组将指向已在重载运算符+

最后在这个分配之后,我将有一个内存泄漏,它将是(sizeof(Matrix))字节,这些字节在操作符+函数处分配

sum = new Matrix;

所以我想要一个答案,表明在第二种情况下如何避免内存泄漏。

我再说一遍,实施并不好,但我只是为了表明我的问题。 此外,我可能只有指向Matrix的指针,并使所有的矩阵函数返回矩阵指针。这将解决许多问题,但我想要解决这个特定情况。

2 个答案:

答案 0 :(得分:3)

operator+的正确原型是

Matrix operator+(Matrix add);

并且如果可用,则使用operator+=

实施
{
   add += *this;  //or just the logic if += isn't implemented
   return add;
}

请注意,add是按值传递的,因为您无论如何都在修改它(而不是创建新的Matrix) - 这为优化留出了空间。

替代免费功能将是:

 Matrix operator+ (Matrix mat1, const Matrix& mat2)
 {
     mat1 += mat2;
     return mat1;
 }

答案 1 :(得分:1)

operator +应该返回Matrix,而不是Matrix&。忘了后者。

详见Scott Meyers的第21项有效C ++。

A fraction here