C++ 使用运算符+;没有内存泄漏?
因此,所讨论的代码是:C++ 使用运算符+;没有内存泄漏?,c++,string,operators,operator-keyword,C++,String,Operators,Operator Keyword,因此,所讨论的代码是: const String String::operator+ (const String& rhs) { String tmp; tmp.Set(this->mString); tmp.Append(rhs.mString); return tmp; } 这当然会将字符串放在堆栈上,它会被删除并返回垃圾。 将其放在堆上会泄漏内存。那么我应该怎么做呢?根据。然后,分配的临时堆栈将被安全地复制到接受返
const String String::operator+ (const String& rhs)
{
String tmp;
tmp.Set(this->mString);
tmp.Append(rhs.mString);
return tmp;
}
这当然会将字符串放在堆栈上,它会被删除并返回垃圾。
将其放在堆上会泄漏内存。那么我应该怎么做呢?根据。然后,分配的临时堆栈将被安全地复制到接受返回值的存储器。如果您有一个工作的复制构造函数,您的解决方案不会返回垃圾-字符串对象
tmp
在块结束时被销毁之前被复制到结果对象中
您可以通过替换
String tmp;
tmp.Set(this->mString);
与
(您需要一个正确工作的复制构造函数来执行此操作,但是您的
return
语句无论如何都需要它)如果您使用std::string,则它既不会泄漏也不会返回垃圾
你的类是否有一个复制构造函数(可以工作)
无论哪种方式,它都不会泄漏(除非字符串设计非常糟糕,即调用析构函数时不会释放内部内存)没有内存泄漏。但您可能希望将返回类型更改为String,而不是“conststring”。否则这个函数就没有多大用处了为什么会返回垃圾?临时值是按值返回的。您的意思是让它返回引用吗?否则,正如弗雷德提到的,它将通过val返回,一切正常。另一方面,通过ref返回…正如在维基百科上看到的(没有说它泄漏了,我说如果我在堆上分配它并返回它,它会泄漏。失败的是我的复制构造函数。
String tmp(*this);