首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有boost::weak_intrusive_pointer吗?

有boost::weak_intrusive_pointer吗?
EN

Stack Overflow用户
提问于 2010-03-08 17:59:47
回答 4查看 3.2K关注 0票数 14

由于遗留原因,我需要使用介入式指针,因为我需要将原始指针转换为智能指针的能力。

然而,我注意到boost没有一个弱的侵入性指针。我确实在boost线程列表上找到了关于它的讨论,但是没有具体的内容。

有人知道弱侵入式指针的线程安全实现吗?

谢谢Rich

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-08 20:12:12

这没有任何意义。

更详细地说:weak_ptr指向与shared_ptr相同的counter对象实例。当shared_ptr超出作用域时,counter的实例会留下来(有效计数为0),这允许weak_ptr实例检查它们是否有效地指向一个释放的对象。

使用侵入式计数,计数器被集成到对象中。当计数达到0时,对象通常要么被回收,要么被删除...但重点是计数器不再可用。其基本原理是,这允许更有效的存储(1个单块)和更快的速度(缓存局部性)。

如果您需要弱引用计数,并且不关心侵入式计数的好处,则可以组合使用shared_ptrweak_ptr

其思想是解除计数器与对象的关联。

代码语言:javascript
复制
class Counted
{
  // bla
private:
  boost::shared_ptr<int> mCounter;
};

现在你可以返回弱句柄了:

代码语言:javascript
复制
class WeakHandle
{
public:
  explicit WeakHandle(Counted& c): mCounter(c.mCounter), mObject(&c) {}

  bool expired() const { return mCounter.expired(); }

private:
  boost::weak_ptr<int> mCounter;
  Counted* mObject;
};

在这里,我们将计数器的生命周期从对象的生命周期中分离出来,这样它就可以在对象被破坏后存活下来……部分是。从而使weak_ptr有效地成为可能。

当然,使用shared_ptrweak_ptr是线程安全的;)

票数 11
EN

Stack Overflow用户

发布于 2015-02-27 09:23:50

我真的不喜欢前面的两个答案,所以:

不,我不知道有什么实现,但我认为这是可能的。shared_ptr的标准实现包含两个引用计数,一个用于“强”引用,另一个用于“弱”引用,以及一个指向引用对象的指针。在intrusive_ptr实现中,强计数需要是对象的一部分,但弱计数不能。所以,看起来你可以创建一个“弱”的intrusive_ptr。

定义一个弱指针辅助对象:

代码语言:javascript
复制
template<class X>
class intrusive_ptr_weak_helper {
    long weak_ref_count;
    X *target_instance;
};

然后将其记录到引用计数旁边的对象中:

代码语言:javascript
复制
struct X {
    ...
    intrusive_ptr_weak_helper *ref_weak_helper;
    ...
    long ref_count;
    ...
};

构造X时:

代码语言:javascript
复制
ref_count = 0;
ref_weak_helper = NULL;

在被删除之前,“强”指针intrusive_strong_ptr与intrusive_ptr是相同的。当强引用计数变为零时(删除前):

代码语言:javascript
复制
if (ref_weak_helper != NULL) {
    if (ref_weak_helper->weak_ref_count == 0)
        delete ref_weak_helper;
    else
        ref_weak_helper->target_instance = NULL;
}

“弱”版本intrusive_weak_ptr记录指向弱助手的指针,操作引用计数,并通过target_instance指针访问目标对象。当weak_ref_count递减到零时,target_instance的状态决定是否删除帮助器。

缺少许多细节(例如并发问题),但这是shared_ptr和intrusive_ptr的混合。它保持了intrusive_ptr的基本优点(缓存优化、第三方侵入式(强)引用计数的重用、强指针和弱指针替代是指针大小),同时主要在弱引用路径中添加额外的工作。

票数 6
EN

Stack Overflow用户

发布于 2010-03-08 18:50:46

介入式指针的当前实现是使用引用计数器。因此,删除对象delete也会删除计数器,因此weak_intrusive_pointer永远不会知道对象已被删除。

如果您需要从this获取weak_ptr,您可能会搜索boost::enable_shared_from_this

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2400458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档