2010-01-18 64 views
3

所以有问题的代码是这样的:使用operator +而不泄漏内存?

const String String::operator+ (const String& rhs) 
{ 
    String tmp; 
    tmp.Set(this->mString); 
    tmp.Append(rhs.mString); 
    return tmp; 
} 

当然这地方在堆栈上的字符串,并将其获取删除,并返回垃圾。 并将它放在堆上会泄漏内存。那么我应该怎么做?

+4

为什么这会返回垃圾?临时值由值返回。 – 2010-01-18 21:42:53

+0

你的意思是让它返回一个参考?否则,正如弗雷德所说,它会通过val返回,一切都很好。另一方面通过参考返回... – 2010-01-18 21:45:48

回答

11

如果您有工作副本构造函数,则您的解决方案不会返回垃圾 - 将字符串对象tmp复制到结果对象中,然后在块的末尾将其销毁。

您也可以用

String tmp(*this); 

更换

String tmp; 
tmp.Set(this->mString); 

做得更好(你需要的正确工作拷贝构造函数,但你需要它反正你return语句)

4

根据rule of three,您应该实现复制构造函数,复制赋值运算符和析构函数。然后,堆栈分配的临时数据将被安全地复制到接受返回值的存储中。

+0

也见于维基百科(http://en.wikipedia.org/wiki/Rule_of_three_(C++_programming) – Motti 2010-01-18 21:57:05

1

如果你使用std :: string这个既不泄漏也不返回垃圾

确实类有一个拷贝构造函数(的作品)

无论哪种方式,它不会泄漏(除非字符串的设计非常糟糕,即犯规释放时,它的析构函数被调用其内部存储器)

+0

没有说它泄漏,我说它会泄漏如果我将它分配在堆上并返回。 这是我的复制构造函数失败。 – xokmzxoo 2010-01-19 16:53:32

0

没有内存泄漏。但是你可能想把返回类型改为String而不是“const String”。否则这个功能不会有太大的用处