我正在尝试为构造函数涉及调用new的类型覆盖+运算符(也就是说,构造函数需要动态分配其他东西),因此析构函数涉及调用delete。在某个地方,我希望能够使用类似的东西:
T c = a + b;
我的问题是我显然需要在+函数内创建一个T类型的对象。如果我在+函数实现中的堆栈上分配一个T的临时实例来返回副本,那么在分配给c之前,该实例的析构函数将被调用为+调用退出和(或者我相信)。所以这不是一个选择。我的另一个选择似乎是使用new
并在返回时取消引用new返回的指针。然而,这种方法的问题似乎是指针将无法访问,并且无法在其上调用delete
。
所以我的问题是......不能在涉及动态分配的类型上重载运算符的情况很少见。人们如何处理这种情况?
答案 0 :(得分:3)
你确保T服从The Rule of 3,并且没有后顾之忧。
答案 1 :(得分:3)
如果在operator+
内的堆栈上创建临时对象,则在退出时,取决于编译器和运算符实现:
c
。 OR c
。 OR c
,并且没有复制构造函数调用。 (见http://en.wikipedia.org/wiki/Return_value_optimization)如前所述,如果您遵循3规则并提供正确的复制构造函数和赋值运算符的实现,则在任何情况下都不会出现任何问题,因此您无需担心实际实现(除非您'对表现感到疯狂)。这就是OOP。
答案 2 :(得分:0)
std::string
和std::vector
能以某种方式做到这一点,而你的课程也是如此。我不建议你学习他们的源代码,这是非常令人生畏的。正如另一张海报所说,3的规则是你的朋友。我可以补充一点,你应该不在你的函数中调用new
。在堆栈上分配并按值返回。 C ++将做必要的魔术。