【问题标题】:Pointer to an element in boost pointer container指向 boost 指针容器中元素的指针
【发布时间】:2009-06-11 11:18:29
【问题描述】:

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

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

【问题讨论】:

  • 其实也有同样的问题。将回到我之前的解决方案(带有显式删除的原始指针向量)。傻,真的。
  • @Cookie 实际上,直到现在(2011 年)我一直在使用指针容器。我使用reference_wrapper。我已经在我正在处理的项目的 wiki 中解释了这一点:sourceforge.net/apps/mediawiki/crackpot/…
  • 好点,谢谢。如果您发现自己有一些空闲时间,那么三种备选方案之间的性能比较可能会很好。

标签: c++ boost pointer-container


【解决方案1】:

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

替代方案似乎是:

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

  • 1234563每项性能可能存在下行空间。

【讨论】:

  • 是的,我猜设计背后的基本原理似乎是,由于指针的所有权属于 A,B 不应该有指针,而是对 pctr 中元素的引用。换句话说,B 的声明必须基于 pctr 中的元素将始终存在这一事实。
  • 虽然语法糖,reference_wrapper 可能正是医生开的。 stackoverflow.com/questions/193703/…
【解决方案2】:

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

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

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

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

【讨论】:

  • 指向 ptr_vector 的迭代器的地址会改变,如果有进一步的插入就会失效。
  • 但是 -1 不是我的(你关于使用 shared_ptrs 向量的说法是有道理的)。
猜你喜欢
  • 2011-02-03
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2011-03-12
  • 1970-01-01
  • 1970-01-01
  • 2023-02-16
相关资源
最近更新 更多