2008-09-22 100 views
11

我們都知道,RAW指針需要被包裹在某種形式的智能指針來獲得異常安全內存管理。但是當談到容器的指針時,問題變得更加棘手。指針和容器

集裝箱堅持所包含的對象是可複製性病因此這排除了使用std :: auto_ptr的,雖然你仍然可以使用boost :: shared_ptr的等

但也有明確設計一些提升容器安全地持有指針:
Pointer Container Library

的問題是: 在什麼情況下,我應該更喜歡smart_pointers的容器使用ptr_containers?

boost::ptr_vector<X> 

or 

std::vector<boost::shared_ptr<X> > 

回答

13

升壓指針容器有超過其所持有的資源,嚴格的所有權。 std :: vector < boost :: shared_ptr < X >>擁有共享所有權。有些原因可能是必要的,但如果不是,我會默認提升:: ptr_vector < X>。因人而異。

1

那麼,開銷是一種情況。

共享指針的矢量會做很多外來複制的是涉及創建一個新的智能指針,遞增參考,遞減的引用,等在一個調整大小。所有這些都可以通過指針容器來避免。

需要分析,以確保集裝箱業務是瓶頸雖然:)

3

常亮:智能指針是處理資源管理的一個很好的方法,但不是唯一的一個。我同意你會在編寫良好的C++代碼中看到很少的原始指針,但根據我的經驗,你也沒有看到那麼多智能指針。有很多完美的異常安全類使用原始指針的容器實現。

+0

這是可能的,有時是最好的選擇,但如果一個類包含2個或更多的RAW指針使它異常安全是不平凡。但我不應該回答你的問題,因此我應該標記你。 – 2008-09-22 17:21:43