-1

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

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 类的这个实现不好,但我这样做是为了说明我的问题)

现在的问题是 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->array 将指向已在重载 operator+ 中分配的 int 数组

最后,在这个分配之后,我将有一个内存泄漏,它将是(sizeof(Matrix))字节,这些字节是在该行的 operator+ 函数中分配的

sum = new Matrix;

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

我再说一遍,实现并不好,但我这样做只是为了展示我遇到的问题。我也可以在 main 中只有指向 Matrix 的指针,并使所有 Matrix 函数返回 Matrix 指针。这将解决许多问题,但我想要解决这个特定情况。

4

2 回答 2

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;
 }
于 2013-07-01T19:52:59.707 回答
1

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

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

这里有一小部分

于 2013-07-01T19:50:59.660 回答