我无法理解如何std::enable_shared_from_this::shared_from_this
返回与现有指针共享所有权的共享pinter.换句话说,你做这个:
std::shared_ptrgetFoo() { return shared_from_this(); }
因此,当你打电话时,getFoo
它是如何得到另一个shared_ptr
共享所有权的另一个,而不是创建一个shared_ptr
拥有相同的独立this
.
我需要理解这一点,以便能够理解如何从某个对象创建shared_ptr,这些对象都会增加相同的引用计数而不会初始化单独的shared_ptr
s.
enable_shared_from_this
有一个weak_ptr
数据成员.该shared_ptr
如果构造可以检测到T
源自enable_shared_from_this
.如果是,则shared_ptr
构造函数将*this
(在哪个位置shared_ptr
)分配给weak_ptr
数据成员enable_shared_from_this
.shared_from_this()
可以创建一个shared_ptr
从weak_ptr
.
可能的实现示例:
templateclass enable_shared_from_this { protected: constexpr enable_shared_from_this() { } enable_shared_from_this(enable_shared_from_this const&) { } enable_shared_from_this& operator=(enable_shared_from_this const&) { return *this; } public: shared_ptr shared_from_this() { return self_.lock(); } shared_ptr shared_from_this() const { return self_.lock(); } private: weak_ptr self_; friend shared_ptr ; }; template shared_ptr ::shared_ptr(T* ptr) { // ... // Code that creates control block goes here. // ... // NOTE: This if check is pseudo-code. Won't compile. There's a few // issues not being taken in to account that would make this example // rather noisy. if (is_base_of , T>::value) { enable_shared_from_this & base = *ptr; base.self_ = *this; } }