【问题标题】:Trouble switching from vector of dumb pointers to boost::shared_ptr从哑指针向量切换到 boost::shared_ptr 时出现问题
【发布时间】:2012-06-10 01:16:56
【问题描述】:

好吧,这让我困扰了几个月,所以我会看看是否有其他人可以帮助解决这个问题。

所以在我的主程序中,我有两种结构(solarBody_t、ship_t),它们都派生自同一个基类(physical_t)。我制作了两个对象的向量,因为我不能将 solarBody 和船放在同一个向量中。它们都是哑指针向量。
我尝试使用 boost::shared_ptrs 的向量将两者放在同一个向量中。现在,据我了解,shared_ptrs 应该具有与哑指针相同的语义和语法(例如 foobar->mass = 42; 应该适用于两者)。但是,只是将声明更改为 boost::shared_ptr 的向量到哑指针,当我尝试将某些内容推送到 shared_ptrs 的向量时,它会给我一个错误。

据我所知,这应该可行。 boost 文档给出了

的例子
boost::shared_ptr<int> p(new int(2));

这几乎就是我正在做的事情。

有没有人有过这方面的经验?或者想提出另一种将所有内容存储在向量中的方法?

更多细节,here's the gist of it(有点矛盾,但我做了双关语,所以就在那里。)

【问题讨论】:

标签: c++ boost vector shared-ptr


【解决方案1】:

我认为它不会让您从裸指针自动构造 shared_ptrpush_back 期待的是 shared_ptr&lt;foobar_t&gt;,而不是裸露的 foobar_t。你应该看看boost::make_shared 并尝试这样的事情:

entity_smart.push_back(boost::make_shared<foobar_t>(42));

make_shared 有几个优点:即,它在一次分配中分配指针控制块和对象本身,并在您的代码中保留不匹配的new。它还明确表明您正在为对象创建 shared_ptr

除此之外,是的,语义应该基本相同。但请记住,如果您实际上不需要共享对象的所有权,shared_ptr 对于您正在做的事情可能有点过头了。

【讨论】:

  • 我绝对想尽量减少过度杀伤,因为这个程序应该尽可能高效(目标硬件会有点慢)。这样做的目的也是为了能够让 solarBody_t 和 ship_t 在同一个向量中,这导致了 boost::shared_ptr。听起来您有一种智能指针的味道?我绝对愿意接受建议。
  • 如果你想将包含对象的生命周期与数组本身联系起来,你可能想看看shared_array,或者如果你想拥有较低开销的托管共享所有权,你可能想看看intrusive_ptr .不过,我不知道我能在多大程度上发表评论。
  • 基本上,这样的事情有很多设计考虑因素。在这一点上挑剔存储也可能是过早的优化。您可以随时进行分析和重构。
  • 这可能就是我最终要做的事情,这个项目将在六天内完成。我会很开心选择容器。非常。另外,感谢您的帮助和跟进。
【解决方案2】:

横向思考:

您实际上并不需要shared_ptr,您需要的是一个用于存储多态值的 STL(-like) 集合;集合是所有者。

你基本上有两种解决方案:

  • 使用指针感知集合:boost::ptr_vector,来自Pointer Container library
  • 使用更好的指针:std::unique_ptr,来自 C++11 标准

即使您可以访问 C++11,我仍然建议 boost::ptr_vector,因为它提供了额外的保证(默认情况下不允许 null)和糖衣(取消引用迭代器提供了引用,而不是您必须提供的指针再次取消引用)。

【讨论】:

  • 整洁。不知道ptr_vector
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 2010-12-04
  • 2021-10-28
  • 1970-01-01
  • 2010-10-16
相关资源
最近更新 更多