2009-06-11 68 views
4

我剛開始使用boost::ptr_vector。我有一個ptr_vector pctr作爲一個類A的成員,並希望另一個類B引用pctr中的元素。在構造類B的對象時,我想在pctr中存儲一個指針。由於指針容器不允許訪問指針(但僅限於引用),因此我必須從pctr中獲取引用的地址,然後將其存儲在類型爲B的對象中。但是,似乎引用了引用的地址直觀。有更好的選擇嗎?指向升壓指針容器中元素的指針

+0

其實有同樣的問題。將回到我以前的解決方案(帶有明確刪除的原始指針向量)。傻,真的。 – Cookie 2011-05-28 13:43:47

+0

@Cookie實際上,直到現在(2011)我一直在使用指針容器。我使用了reference_wrapper。我已經在我正在從事的一個項目的wiki中解釋了這一點:http://sourceforge.net/apps/mediawiki/crackpot/index.php?title=Boost_Pointer_Containers – 2011-06-03 09:32:59

+0

好的,謝謝。如果你發現自己有一些閒暇時間,三種選擇之間的性能比較可能會很好。 – Cookie 2011-06-06 10:06:19

回答

0

我認爲採用解除引用迭代器的地址是實現你想要做的事情的正確方法。

iterator it = ... 
T *ptr = &*it; 

但是,這是危險的,因爲如果A對象在B對象之前被銷燬,那麼最終可能會出現懸掛指針。這就是爲什麼release函數允許調用者獲取對象的地址,也可以從容器中移除指針。

如果您可以支持開銷,您可以考慮將boost::ptr_vector更改爲智能指針向量,例如, std::vector<boost::shared_ptr<T> >

2

正如你發現的那樣,boost指針容器很好地保護了它們的指針。 當然,你可以通過獲取它將會產生的引用的地址來打敗它,但請注意,你可能正在通過掛在這些指針上來削弱指針容器對權威所有權的要求的強度(所有這些取決於你的其餘部分代碼真的)。

替代似乎是:

  • 具有B級保持迭代器引用感興趣的指針容器元素(當然通常的迭代器失效規則必須要處理)。

  • 由於A擁有指針,而您似乎希望B持有某種非擁有的弱引用,因此請使用容器shared_ptr來代替,並使B使用weak_ptr。下行可能表現不佳。