这种“设计”的一种可能用途是用于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()
制作共享指针。如果您确实复制了此代码,请注意,通过其他方式从中构造共享指针是行不通的。共享指针构造函数需要修改(如上面的标准引用所解释)。