返回对动态分配对象的引用
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 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项。
这里的分数
相关文章:
- 引用对象成员函数的成员函数
- 从 Base 引用对象调用派生类的成员
- 转换引用对象的边界框?
- 现代编译器会优化只引用对象子集的局部变量吗
- l值引用对象上的Constexpr成员函数:Clang和gcc不同意
- 将 const 类型引用对象注册为类成员对象C++
- Boost Intervocess:通过迭代通过从结构引用对象的映射进行迭代时
- 无法用2D矢量成员引用对象
- 在由引用对象传递中访问由引用对象传递的变量
- 如何使用QString引用对象名称
- 使用自动迭代器引用对象
- C++ 在另一个对象中引用对象的当前状态
- 使用共享对象和引用对象进行引用计数
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- 引用对象的动态类型何时可以更改
- 引用对象内部的指针
- C++从全局静态函数中引用对象
- C++如何仅在没有其他人直接或间接引用对象指针时删除该指针
- 如何使用C++引用对象
- 为什么引用对象仅保存特定类型的引用