2009-06-11 69 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。下行可能表现不佳。