我有以下示例来说明我的问题。
我有类矩阵
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 指针。这将解决许多问题,但我想要解决这个特定情况。