2011-01-29 147 views
6

在讀取timdays answerthis question之後,我對boost::ptr_containerstd::vector<shared_ptr>之間的區別感到好奇。我的印象是a boost::ptr_container had ownership over the pointers given to it,一經發布,就會調用它所包含的所有指針的析構函數,而不管其他對其居民的引用如何。這與std::vector<shared_ptr>的目的是相反的,如果引用計數爲0,它只會釋放指針本身?boost :: ptr_container和std :: vector <shared_ptr>

如果是這樣的話(我認爲它沒有),爲什麼會連Boost文檔例如compare the two就好像他們是在類似的用途,以及爲什麼會timday的回答提出了boost::ptr_container當它的目的很不同的std::vector<shared_ptr>

回答

7

你說得對,兩者差別很大。

正如您注意到的,第一個區別是所有權語義。指針容器中項目的所有權不共享。在這方面,boost::ptr_vector<T>更接近std::vector<std::unique_ptr<T>>

但這不是唯一的區別!

  • 除非在類型明確說明,一個指針容器將不包含任何空指針
  • 一個指針容器具有深拷貝語義(使用new_clone方法),並且僅能被複制,如果所保持的物體是可複製
  • 指針容器具有很深的常量語義,即容器是const,那麼不能改變它的一個元素。

至於爲什麼@timday覺得不得不提到升壓指針容器,我認爲這是因爲他想擴大這個問題。 Boost指針容器非常類似於可以容納多個對象的智能指針,並且提供了一般的指針容器的更好的語法。

關於他相比於std::vector< boost::shared_ptr<T> >我認爲這很簡單,因爲這是自auto_ptr在沒有移動語義(無unique_ptr)的實施指針的向量不能在STL容器中使用的傳統方式。人們大部分時間都不知道指針容器...

1

有兩種情況可以應用:比如說一堆函數充當容器的客戶端,指向多態對象並對其進行操作。如果容器超出所有功能,則可以用指針容器替換它。

Timday通過指出列表中的遺漏回答了「以下一組指針[s]之間有什麼區別」的問題。

相關問題