2013-06-12 53 views
0

下面的代碼是表示存儲器管理的不良例子的圖。項目永遠不會被分配,因爲它的臨時副本將被返回。如何避免返回一個臨時對象(C++)

我已經沖刷和關閉數週的編程論壇,但還沒有找到一個明確的解釋,如何正確的返回類型項目的有效實例*而被取消分配允許項目。 換句話說,完成相同的返回值並允許項目被取消分配的代碼的更好的替代方法是什麼?

Item* Inventory::add(const string& name) 
{ 
    Item* item = new Item(name); 
    ...(some other code here)... 
    return item; 
} 

謝謝!

+0

怎麼樣'的std ::的unique_ptr '? –

+0

我不明白爲什麼這是一個問題。您已經將唯一指向_item_的指針副本返回給客戶端 - 現在客戶端的工作是將其分配給客戶端。只需在合同/文件/意見中明確說明這一事實。 – DaoWen

回答

0

您可能會認爲一旦它超出循環,所有內容都將被銷燬,但返回的指針(和指向的內存)將保留。它被轉移到調用此方法的對象,並且沒有內存泄漏。

+0

謝謝。請允許我補充一件事:我沒有客戶端的代碼部分,所以我無法從那裏取消分配項目。是否有另一種方法來避免內存泄漏? – user2476826

+0

這確實取決於您的代碼部分的範圍和可見性。在我看到的生產代碼的一個例子中,有一些由一個全局主管理器類處理的「管理器」類。用戶必須創建指向主管理器類的指針。然後,當用戶需要其中一個「manager」類時,他們可以像往常一樣調用'new'來獲取指針,但不應該自己釋放這些指針;它們只需要調用主管理器指針的'delete',並且它將反過來釋放所有現有的管理器類。 – Neoh