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

Returning references to dynamically allocated objects

本文关键字:引用 对象 动态分配 返回      更新时间:2023-10-16

我有下面的例子来说明我的问题
我有类矩阵

class Matrix{

   private:
      int *array;
      int x;
      int y;
   public:
      //some other things..
      Matrix& operator+(Matrix& add);
      Matrix& operator=(Matrix& matr);
}

我希望运算符+返回一个全新的对象,该对象将被分配给矩阵对象,而不是对矩阵的引用或对矩阵的指针。所以运算符=只需要一点一点地复制这些值。

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

现在的问题是运营商+的实现

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

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

最后,在该分配之后,我将出现内存泄漏,这将是在行的运算符+函数处分配的(sizeof(Matrix))字节

sum = new Matrix;

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

我重申,执行情况并不好,但我这样做只是为了表明我存在的问题。此外,我本可以在main中只有指向矩阵的指针,并使所有矩阵函数都返回矩阵指针。这将解决许多问题,但我想要一个解决这个具体情况的方案。

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的《有效C++》中的第21项。

这里的分数