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