14

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

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 获得的结果智能指针的地方都没有真正保留智能指针。

4

1 回答 1

19

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

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

它达到了相同的效果std::enable_shared_from_this,有趣的是,cppreference.com 提到了这个设计

enable_shared_from_this 的一个常见实现是持有对 this 的弱引用(例如 std::weak_ptr)。std::shared_ptr 的构造函数检测到 enable_shared_from_this 基的存在,并将新创建的 std::shared_ptr 分配给内部存储的弱引用

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

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


可能的重构:

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

  • 如果您不使用 C++11 但可以使用 boost,请使用boost::enable_shared_from_this,请参阅boost 文档。您应该通过调用从中检索共享指针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()制作共享指针。如果您确实复制了此代码,请注意,通过其他方式从中构造共享指针是行不通的。共享指针构造函数需要修改(如上面的标准引用所解释)。

于 2014-06-26T00:40:49.433 回答