指向boost指针容器中的元素的指针

时间:2009-06-11 11:18:30

标签: c++ boost pointer-container

我刚刚开始使用boost::ptr_vector。我有一个ptr_vector pctr作为一个A类的成员,并希望另一个B类引用pctr中的元素。在构造B类对象时,我希望在pctr中存储指针。

由于指针容器不允许访问指针(但仅允许访问引用),我必须从pctr获取引用的地址,然后将其存储在类型B的对象中。但是参考似乎不直观。还有更好的选择吗?

2 个答案:

答案 0 :(得分:2)

正如您所发现的那样,增强指针容器可以很好地保护它们的指针。 当然,你可以通过获取它将产生的引用的地址来打败它,但要注意你可能通过挂在这些指针上来稀释指针容器声称权威所有权的强度(所有这些都取决于你的代码的其余部分)真)。

替代品似乎是:

  • 让B类保持迭代器引用感兴趣的指针容器元素(当然通常的迭代器失效规则必须处理)。

  • 由于A拥有指针并且您似乎希望B拥有某种非拥有的弱引用,请使用shared_ptr的容器代替,并让B使用weak_ptr 。下行可能是每次表现。

答案 1 :(得分:0)

我认为使用解除引用迭代器的地址是实现你想要做的事情的正确方法。

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

然而,这很危险,因为如果A对象在B对象之前被销毁,你最终可能会遇到悬空指针。这就是release函数,它允许调用者获取对象的地址,也从容器中删除指针。

如果您可以支持开销,可以考虑将boost::ptr_vector更改为智能指针向量,例如std::vector<boost::shared_ptr<T> >