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