更好的shared_ptr由“所有权”和“参考”的不同类型?

时间:2016-08-04 21:01:24

标签: c++ shared-ptr dereference ownership weak-ptr

我想使用类似指针的对象

Ownership<Type> m_foo

拥有对象和句柄

Reference<Type> m_someFoo

作为另一个上下文中的经典“指针”,而我的 Reference 应该知道原始对象何时不再存在(例如通过返回nullptr)并且还应该可以防止原始对象从删除一小段时间(锁定)。

我知道 shared_ptr (所有权)和 weak_ptr (参考)提供了类似的功能。但是,锁定 weak_ptr 并访问原始ptr涉及创建一个相当慢的 shared_ptr 。此外,我无法在访问原始ptr之前决定不锁定 weak_ptr (例如,当知道该对象现在没有被删除时)。

实施所有权参考是否明智如下:

  • 所有权知道参考的地址(例如std::list<Reference<Type>*>
  • 当拥有的对象衰减时,这些参考设置为nullptr
  • 参考包含ptr到所有权中的uint m_lockCount
  • 锁定时m_lockCount++,解锁m_lockCount--
  • 所有权m_lockCount != 0
  • 时无法释放对象

此解决方案对于少数参考实例和参考的高访问率特别可行。

1 个答案:

答案 0 :(得分:0)

由于使用shared_ptr/weak_ptr作为引用的反向指针的想法,您建议的替代方法将比std::list慢得多。如果您只在单线程模式下工作,那将是唯一的额外开销。添加线程,你需要一个锁来自动操作你的引用计数和引用列表(虽然你有一个列表,你不需要计数)。 shared_ptr\weak_ptr会在您的对象上添加几个指针,并且在初始值之后没有动态分配。