????首先看cppreference的解釋:
std::enable_shared_from_this?allows an object?t?that is currently managed by a?std::shared_ptr?named?pt?to safely generate additional?std::shared_ptr?instances?pt1, pt2, ...?that all share ownership of?t?with?pt.Publicly inheriting from?std::enable_shared_from_this?provides the type?T?with a member function?shared_from_this. If an object?t?of type?T?is managed by a?std::shared_ptr?named?pt, then calling?T::shared_from_this?will return a new?std::shared_ptr?that shares ownership of?t?with?pt
意思就是說,如果一個T類型的對象t,是被std::shared_ptr管理的,且類型T繼承自std::enable_shared_from_this,那么T就有個shared_from_this的成員函數,這個函數返回一個新的std::shared_ptr的對象,也指向對象t。
? ? 那么這個特性的應用場景是什么呢?一個主要的場景是保證異步回調函數中操作的對象仍然有效。比如有這樣一個類:
Foo::Bar接受一個函數對象,這個對象需要一個Foo*指針,其實要的就是Foo::Bar的this指針,但是這個回調是異步的,也就是說可能在調用這個回調函數時,this指向的Foo對象已經提前析構了。這時候,std::enable_shared_from_this就派上用場了。修改后如下:
這樣就可以保證異步回調時,Foo對象仍然有效。
? ? 注意到cppreference中說道,必須要是std::shared_ptr管理的對象,調用shared_from_this才是有效的,為什么呢?這個就需要看看std::enable_shared_from_this的實現原理了:
? ? std::enable_shared_from_this<T> 有一個std::weak_ptr<T>的成員,實際上在構造std::enable_shared_from_this<T>時,并沒有初始化std::weak_ptr<T>成員,而是在用這個std::enable_shared_from_this<T>去構造std::shared_ptr的時候,去構造并初始化這個std::weak_ptr<T>成員。所以這也就是為什么cppreference中說的這個對象必須是std::shared_ptr管理的,因為這個對象不是通過std::shared_ptr來管理,那么std::weak_ptr是未初始化的,無法通過其提升為std::shared_ptr對象。OK,原理說了,具體實現可以去看代碼,不了解std::weak_ptr和std::shared_ptr的關系的,可以看看這篇文章:關于shared_ptr的幾個問題