2011-08-15 36 views
2

對於像std::vectorstd::list這樣的容器,聲明boost::shared_ptr究竟有什麼意義?shared_ptr對容器有什麼意義?

這裏是一個利用BOOST_AUTO的例子。

void someFunction() 
{ 
    ... 
    BOOST_AUTO(sharedPtrToContainer, boost::make_shared<std::vector<T>>()); 
    ... 
} 

如果您只需要本地容器,是否有任何意義?有什麼好處?將一個shared_ptr用於容器的用途是什麼?

+3

這與將'shared_ptr'聲明爲其他任何內容相同:你這樣做是因爲你想要堆上的對象,但不想手動'刪除'它。我認爲你真正的問題是如果僅在函數內部使用本地容器,那麼在堆上分配容器的意義何在。您確定該函數不會將指針存儲在某處以備後用嗎? – Wyzard

+0

矢量/列表是否共享所有權?如果是這樣,共享指針可能有意義。如果不是,共享指針沒有意義。 – robert

+0

@Wyzard:謝謝你展現這個! – alexfr

回答

7

究竟是什麼點t宣佈boost::shared_ptr到像std::vectorstd::list這樣的容器?

與使用共享指針指向任何對象類型完全相同;它允許您與其他範圍共享該對象的所有權。對象碰巧是一個容器並沒有什麼區別。

如果您只需要本地容器,是否有任何意義?

否;如果你只需要在本地,那麼它應該是一個普通的自動對象。

有什麼好處?將一個shared_ptr用於容器的用途是什麼?

如果您需要將其生存期延長到當前範圍之外,那麼您需要動態創建並銷燬它,然後它的生存期應由智能指針管理。

+1

四個解釋基本常識的upvotes。有另一種! –

0

如果你只需要在本地,然後使用自動實例:

std::vector<T> inst; 

如果您需要返回並T重(或載體是大的離譜),然後使用該shared_ptr或指針的向量(T很重,它很小),否則返回值,例如vector<int>,根據大小,也可能返回值(我猜很大程度上取決於調用者將使用它做什麼)...

2

如果你只是聲明一個容器充滿指向堆中分配對象的指針,如果你不小心,允許容器超出範圍很容易,並且在那個時候,你有一個內存泄漏。這是因爲容器只取得容器中分配的類型的所有權。例如,對於std::vector<T*>,向量將只保留分配內存的所有權以包含一系列指針......它不會維護那些指針指向的對象的所有權。這只是因爲它不能......容器如何知道它指向一個堆對象而不是其他東西?如果它指向一個堆對象,它將如何知道它是該堆對象的唯一引用,並且可以在必要時將其刪除,而不會創建一堆懸掛指針?實際情況是因爲STL容器不包含這種全局狀態信息,他們不可能知道這些問題的答案,因此,由STL容器管理的唯一內存就是它爲其自己的對象分配的內存,它控制。因此,當存儲指針的容器超出範圍時,用於分配指針的內存將被正確銷燬,但容器本身不會在每個指針上調用delete來釋放每個指針在堆上指向的對象。使用std::shared_ptr<T>作爲STL容器的類型允許容器超出範圍,並刪除爲陣列中分配的每個shared_ptr分配的內存。由於引用計數對象狀態信息存儲在shared_ptr中,但一旦刪除了對象的最後一個引用,它本身就會正確銷燬它所管理的堆上的對象。因此,如果你有一個STL容器超出了範圍,那麼容器中的任何shared_ptrs是他們指向的對象的最後一個引用將會正確地銷燬堆中的對象,並且最終不會得到從指針丟失到堆對象的一系列內存泄漏。

+0

非常感謝您的解釋,但我詢問'shared_ptr'的容器不是關於包含'shared_ptr's的容器。 – alexfr