所以有问题的代码是这样的:使用operator +而不泄漏内存?
const String String::operator+ (const String& rhs)
{
String tmp;
tmp.Set(this->mString);
tmp.Append(rhs.mString);
return tmp;
}
当然这地方在堆栈上的字符串,并将其获取删除,并返回垃圾。 并将它放在堆上会泄漏内存。那么我应该怎么做?
所以有问题的代码是这样的:使用operator +而不泄漏内存?
const String String::operator+ (const String& rhs)
{
String tmp;
tmp.Set(this->mString);
tmp.Append(rhs.mString);
return tmp;
}
当然这地方在堆栈上的字符串,并将其获取删除,并返回垃圾。 并将它放在堆上会泄漏内存。那么我应该怎么做?
如果您有工作副本构造函数,则您的解决方案不会返回垃圾 - 将字符串对象tmp
复制到结果对象中,然后在块的末尾将其销毁。
您也可以用
String tmp(*this);
更换
String tmp;
tmp.Set(this->mString);
做得更好(你需要的正确工作拷贝构造函数,但你需要它反正你return
语句)
根据rule of three,您应该实现复制构造函数,复制赋值运算符和析构函数。然后,堆栈分配的临时数据将被安全地复制到接受返回值的存储中。
也见于维基百科(http://en.wikipedia.org/wiki/Rule_of_three_(C++_programming) – Motti 2010-01-18 21:57:05
如果你使用std :: string这个既不泄漏也不返回垃圾
确实类有一个拷贝构造函数(的作品)
无论哪种方式,它不会泄漏(除非字符串的设计非常糟糕,即犯规释放时,它的析构函数被调用其内部存储器)
没有说它泄漏,我说它会泄漏如果我将它分配在堆上并返回。 这是我的复制构造函数失败。 – xokmzxoo 2010-01-19 16:53:32
没有内存泄漏。但是你可能想把返回类型改为String而不是“const String”。否则这个功能不会有太大的用处
为什么这会返回垃圾?临时值由值返回。 – 2010-01-18 21:42:53
你的意思是让它返回一个参考?否则,正如弗雷德所说,它会通过val返回,一切都很好。另一方面通过参考返回... – 2010-01-18 21:45:48