Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用运算符+;没有内存泄漏?_C++_String_Operators_Operator Keyword - Fatal编程技术网

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);