2010-01-18 71 views
3

所以有問題的代碼是這樣的:使用operator +而不泄漏內存?

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

當然這地方在堆棧上的字符串,並將其獲取刪除,並返回垃圾。 並將它放在堆上會泄漏內存。那麼我應該怎麼做?

+4

爲什麼這會返回垃圾?臨時值由值返回。 – 2010-01-18 21:42:53

+0

你的意思是讓它返回一個參考?否則,正如弗雷德所說,它會通過val返回,一切都很好。另一方面通過參考返回... – 2010-01-18 21:45:48

回答

11

如果您有工作副本構造函數,則您的解決方案不會返回垃圾 - 將字符串對象tmp複製到結果對象中,然後在塊的末尾將其銷燬。

您也可以用

String tmp(*this); 

更換

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

做得更好(你需要的正確工作拷貝構造函數,但你需要它反正你return語句)

4

根據rule of three,您應該實現複製構造函數,複製賦值運算符和析構函數。然後,堆棧分配的臨時數據將被安全地複製到接受返回值的存儲中。

+0

也見於維基百科(http://en.wikipedia.org/wiki/Rule_of_three_(C++_programming) – Motti 2010-01-18 21:57:05

1

如果你使用std :: string這個既不泄漏也不返回垃圾

確實類有一個拷貝構造函數(的作品)

無論哪種方式,它不會泄漏(除非字符串的設計非常糟糕,即犯規釋放時,它的析構函數被調用其內部存儲器)

+0

沒有說它泄漏,我說它會泄漏如果我將它分配在堆上並返回。 這是我的複製構造函數失敗。 – xokmzxoo 2010-01-19 16:53:32

0

沒有內存泄漏。但是你可能想把返回類型改爲String而不是「const String」。否則這個功能不會有太大的用處