3

所以有问题的代码是这样的:

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

这当然会将 String 放在堆栈上,它会被删除并返回垃圾。将它放在堆上会泄漏内存。那么我该怎么做呢?

4

4 回答 4

11

如果您有一个工作副本构造函数,您的解决方案不会返回垃圾 - String 对象tmp在块末尾被销毁之前被复制到结果对象中。

您可以通过替换来做得更好

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

String tmp(*this);

(为此,您需要一个正确工作的复制构造函数,但无论如何您的return语句都需要它)

于 2010-01-18T21:47:06.717 回答
4

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

于 2010-01-18T21:46:29.843 回答
1

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

您的班级是否有复制构造函数(有效)

无论哪种方式,它都不会泄漏(除非 String 设计得非常糟糕,即在调用其析构函数时不会释放其内部内存)

于 2010-01-18T21:50:13.970 回答
0

没有内存泄漏。但是您可能希望将返回类型更改为 String 而不是“const String”。否则这个功能不会有太大用处

于 2010-01-19T04:06:45.720 回答