繁体   English   中英

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

[英]Returning references to dynamically allocated objects

我有以下示例来说明我的问题。
我有矩阵课

class Matrix{


   private:

      int *array;
      int x;
      int y;

   public:

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

}

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

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

现在的问题是操作符+的实现

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

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

但这带来了问题,因为对象和当然会被销毁,而矩阵的析构函数当然会被销毁

 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-> array将指向已在重载运算符+中分配的int数组

最终,在进行此设置后,我将发生内存泄漏,它将是在该行的operator +函数中分配的(sizeof(Matrix))个字节

sum = new Matrix;

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

我再说一遍实现不是很好,但是我只是为了说明我所遇到的问题。 我也可以只在main中有指向Matrix的指针,并使所有Matrix函数返回Matrix指针。这可以解决很多问题,但我想针对这种情况下解决方案。

适用于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;
 }

运算符+应该返回Matrix,而不是Matrix&。 只是忘记后者。

有关详细信息,请参见Scott Meyers的项目21 In Effective C ++。

这里的一小部分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM