我有以下例子来说明我的问题 我有类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的指针,并使所有的矩阵函数返回矩阵指针。这将解决许多问题,但我想要解决这个特定情况。
答案 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)