所以有问题的代码就是:
const String String::operator+ (const String& rhs)
{
String tmp;
tmp.Set(this->mString);
tmp.Append(rhs.mString);
return tmp;
}
这当然会将String放在堆栈上并被删除并返回垃圾。 将它放在堆上会泄漏内存。那我该怎么做呢?
答案 0 :(得分:11)
如果你有一个工作副本构造函数,你的解决方案不会返回垃圾 - 在块结束时销毁String对象tmp
之前将其复制到结果对象中。
您可以通过替换
来做得更好String tmp;
tmp.Set(this->mString);
与
String tmp(*this);
(你需要一个正确工作的复制构造函数,但是你的return
语句无论如何都需要它)
答案 1 :(得分:4)
根据rule of three,您应该实现复制构造函数,复制赋值运算符和析构函数。然后堆栈分配的临时将安全地复制到接受返回值的存储。
答案 2 :(得分:1)
如果你使用std :: string这既不泄漏也不返回垃圾
你的类有一个复制构造函数(有效)
无论哪种方式它都不会泄漏(除非String的设计非常糟糕,即在调用析构函数时不会释放内部内存)
答案 3 :(得分:0)
没有内存泄漏。但您可能希望将返回类型更改为String而不是“const String”。否则这个功能用处不大