2010-09-13 52 views
9

對不起,如果這是明確地回答某處,但我有點困惑的助推文檔和我在線閱讀的文章。與boost :: shared_ptr(與reset()函數相比)的問題

我看到,我可以使用reset()函數來一個shared_ptr內釋放內存(假設引用計數爲零),例如,

shared_ptr<int> x(new int(0)); 
x.reset(new int(1)); 

我相信,這會導致創建的兩個整數對象,並且在這兩行的末尾,等於零的整數將從內存中刪除。

但是,如果我用下面的代碼塊:

shared_ptr<int> x(new int(0)); 
x = shared_ptr<int>(new int(1)); 

顯然,現在* X == 1爲真,但將原來的整數對象(等於零)可以從內存中刪除或有我泄露了那個記憶?

在我看來,這將是一個賦值運算符減少shared_ptr引用計數的問題,但對源代碼的一瞥似乎沒有爲我解決問題。希望有更有經驗或知識淵博的人能幫助我。提前致謝。

回答

15

的文檔是相當明確的:

shared_ptr & operator=(shared_ptr const & r); // never throws

效果:相當於shared_ptr(r).swap(*this)

所以它只是將您創建的臨時對象與所有權交換。臨時過期,減少參考計數。 (並且如果爲零,則重新分配)


這些容器的目的是不泄漏內存。所以不,你不需要擔心泄漏的東西,除非你想故意搞砸。 (換句話說,您可能不需要懷疑Boost知道他們在做什麼。)

+0

我確實看到了這一點,但後來我也看到了可能相互衝突的其他信息。感謝您的理智檢查。 – RandomGuy 2010-09-14 13:55:39

5

你沒有泄漏內存。第一個int對象的內存將被刪除。