代码之家  ›  专栏  ›  技术社区  ›  amit kumar

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

  •  4
  • amit kumar  · 技术社区  · 15 年前

    我刚开始用 boost::ptr_vector . 我有一个ptr_向量 pctr 作为一个类A的成员并希望另一个类B引用 小精灵 . 在构造类B的对象时,我希望将指针存储在 PCTR .

    因为指针容器不允许访问指针(但只允许访问引用),所以我必须从 小精灵 然后将其存储在类型B的对象中。但是获取引用的地址似乎不是必需的。有更好的选择吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   timday    15 年前

    正如您所发现的,boost指针容器很好地保护了它们的指针。 当然,您可以通过获取它将产生的引用的地址来击败它,但是请注意,您可能会通过挂起这些指针来削弱指针容器对权威所有权的声明的强度(所有这些都取决于您的代码的其他部分)。

    替代方案似乎是:

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

    • 因为a拥有指针,而您似乎希望b持有某种对它的非拥有弱引用,所以使用 shared_ptr 取而代之 weak_ptr 。每场演出都有可能带来负面影响。

        2
  •  0
  •   Luc Touraille    15 年前

    我认为获取解引用迭代器的地址是实现您所要做的事情的正确方法。

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

    但是,这是危险的,因为如果a对象在b对象之前被销毁,那么最终可能会出现悬空指针。这就是为什么 release 函数,该函数允许调用方获取对象的地址,还可以从容器中移除指针。

    如果你能支持开销,你可以考虑改变 boost::ptr_vector 指向智能指针的向量,例如 std::vector<boost::shared_ptr<T> > .