std::enable_shared_from_this的原理及意義

????首先看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

意思就是說,如果一個(gè)T類型的對(duì)象t,是被std::shared_ptr管理的,且類型T繼承自std::enable_shared_from_this,那么T就有個(gè)shared_from_this的成員函數(shù),這個(gè)函數(shù)返回一個(gè)新的std::shared_ptr的對(duì)象,也指向?qū)ο髏。

? ? 那么這個(gè)特性的應(yīng)用場景是什么呢?一個(gè)主要的場景是保證異步回調(diào)函數(shù)中操作的對(duì)象仍然有效。比如有這樣一個(gè)類:

Foo::Bar接受一個(gè)函數(shù)對(duì)象,這個(gè)對(duì)象需要一個(gè)Foo*指針,其實(shí)要的就是Foo::Bar的this指針,但是這個(gè)回調(diào)是異步的,也就是說可能在調(diào)用這個(gè)回調(diào)函數(shù)時(shí),this指向的Foo對(duì)象已經(jīng)提前析構(gòu)了。這時(shí)候,std::enable_shared_from_this就派上用場了。修改后如下:

這樣就可以保證異步回調(diào)時(shí),F(xiàn)oo對(duì)象仍然有效。

? ? 注意到cppreference中說道,必須要是std::shared_ptr管理的對(duì)象,調(diào)用shared_from_this才是有效的,為什么呢?這個(gè)就需要看看std::enable_shared_from_this的實(shí)現(xiàn)原理了:

? ? std::enable_shared_from_this<T> 有一個(gè)std::weak_ptr<T>的成員,實(shí)際上在構(gòu)造std::enable_shared_from_this<T>時(shí),并沒有初始化std::weak_ptr<T>成員,而是在用這個(gè)std::enable_shared_from_this<T>去構(gòu)造std::shared_ptr的時(shí)候,去構(gòu)造并初始化這個(gè)std::weak_ptr<T>成員。所以這也就是為什么cppreference中說的這個(gè)對(duì)象必須是std::shared_ptr管理的,因?yàn)檫@個(gè)對(duì)象不是通過std::shared_ptr來管理,那么std::weak_ptr是未初始化的,無法通過其提升為std::shared_ptr對(duì)象。OK,原理說了,具體實(shí)現(xiàn)可以去看代碼,不了解std::weak_ptr和std::shared_ptr的關(guān)系的,可以看看這篇文章:關(guān)于shared_ptr的幾個(gè)問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容