将弱指针存储到self

时间:2014-06-26 00:26:50

标签: c++ smart-pointers weak-ptr

我使用的代码库部分由一个爱上过度复杂的简单问题解决方案的人实现(例如,模板类有两个参数,只为一对类型实例化)。她做的一件事是在智能指针中创建对象,然后让对象存储一个指向自身的弱指针。

class MyClass {
    //...
    boost::weak_ptr<MyClass> m_self;
    //...
};

boost::shared_ptr<MyClass>
Factory::Factory::Factory::CreateMyClass() {
    boost::shared_ptr<MyClass> obj(new MyClass(...));
    boost::weak_ptr<MyClass> p(obj);
    obj->storeSelfPointer(p);
    return obj;
}

然后,类通过锁定并传递生成的共享指针来继续使用m_self。

对于我的生活,我无法理解她想要完成的事情。是否有一些模式或想法可以解释这种实现?在我看来,这是完全没有意义的,我想重构它。

编辑:我应该提一下,使用从锁定m_self获得的结果智能指针的任何地方都没有实际保留智能指针。

1 个答案:

答案 0 :(得分:17)

这种“设计”的一种可能用法是使用m_self.lock()从中生成共享指针。

如果删除此弱指针成员,则生成的this共享指针的引用计数保持不正确。

它实现了与std::enable_shared_from_this相同,有趣的是cppreference.com mentions this design

  

enable_shared_from_this的常见实现是保持弱势   引用(例如std :: weak_ptr)到此。的构造者   std :: shared_ptr检测到enable_shared_from_this base的存在   并将新创建的std :: shared_ptr分配给内部存储的   弱参考

C ++标准第20.8.2.4节10提到了相同的可能实现:

  

创建唯一指针的shared_ptr构造函数可以检测到   存在enable_shared_- from_this base并分配新的   创建了shared_ptr给它   __weak_this成员


可能的重构:

  • 如果您使用的是C ++ 11,则可以删除std::weak_ptr成员,并公开继承自std::enable_shared_from_this<T>。您应该通过调用shared_from_this()来检索共享指针。

  • 如果您不使用C ++ 11但可以使用提升,请使用boost::enable_shared_from_this,请参阅boost documentation。您应该通过调用shared_from_this()来检索共享指针。

  • 如果你不使用C ++ 11,并且不能使用boost,你可以将标准的建议实现带到你的代码库中,它足够短:

代码:(从§20.8.2.4 - 11复制,删除前导下划线,您可能想要重命名)

template<class T> class enable_shared_from_this {
    private:
     weak_ptr<T> __weak_this;
    protected:
     constexpr enable_shared_from_this() : __weak_this() { }
     enable_shared_from_this(enable_shared_from_this const &) { }
     enable_shared_from_this& operator=(enable_shared_from_this const &) { return *this; }
     ~enable_shared_from_this() { }
    public:
     shared_ptr<T> shared_from_this() { return shared_ptr<T>(__weak_this); }
     shared_ptr<T const> shared_from_this() const { return shared_ptr<T const>(__weak_this); }
};

使用shared_from_this()创建共享指针。如果你复制了这段代码,请注意通过其他方式从中构建共享指针不起作用。需要修改共享指针构造函数(如上面的标准引言所述)。