《Effective Modern C++》item 19: std::shared_ptr

 

 

總結過的關於shared_ptr:https://blog.csdn.net/qq_35865125/article/details/88918909 , 有分析如何自己實現shared_ptr。


----shared_ptr出現於c++ 11, 可以有很多很多個shared_ptr對象指向同一個資源(某個類的實例), ,這些shared_ptr

共同擁有這個資源。 優點: 就像是具備垃圾回收功能的語言,客戶端不用關係何時去釋放資源,同時,何時釋放資源又是deterministric:


----shared_ptr的常識:

--使用shared_ptr的注意事項:由於包含一個指向引用計數的指針,其size是裸指針的兩倍; 用於存儲引用計數

的那塊空間(例如一個int型的數)必須是dynamic allocate(存在於堆空間上);   由於多個線程,增加引用計數值的操作必須是原子操作;

 

------使用move的方式將一個shared_ptr賦值給另一個shared_ptr時,不會導致引用計數的增加:

-----與unique_ptr一樣,shared_ptr的默認刪除其託管的資源的方式是 delete,用戶可以定製刪除資源的函數,但是,兩者在

定製該函數的時候有一些不同, 定製函數的類型是unique_ptr的一部分,卻不是shared_ptr的一部分哦:

-----在custom deleter方面與unique_ptr的另一個不同點是,shared_ptr的size與deleter 函數的大小無關,

無論有沒有指定custom deleter函數,其size都是2個指針的大小,其中也給指針指向其託管的對象地址,另一個

指針指向control bolck,該block是一個堆上的空間,包括了引用計數,custom deleter等等:

 

-----假設有多個shard_ptr對象指向同一個被託管的對象,那麼這些shared_ptr對象使用的control block是

相同的,這樣才能保證引用計數的有效性哦,鑑於此,使用shared_ptr時必須注意以下的東東,要保證

對於一個 需要被託管的類對象 來說不能有兩份control block!!!!!,  注意,儘量不要先new 一個指針變量,然後

再將其傳遞給shred_ptr的構造函數,這樣子相當不規範:

 

-----在類的成員函數中,將this指針傳給shard_ptr的構造函數可能會導致問題,例如,在該成員函數被調用之前

該類對象已經被shared_ptr託管了,這樣話就會出現有兩個control block爲該對象進行引用計數啦:

-----爲了避免上述問題必須採取一些措施,這些措施使用起來感覺比較不美觀,哈哈, 需要使用

std::enable_shared_from_this模板來創造一個基類:


 

--------------------------------------------------總結---------------------------------------------------------------------------------------------------

 

 

-----一旦你使用了一個shared_ptr去託管一個對象,那麼就永遠用shared_ptr操作這個對象吧,不能分離!!:

----不存在std::shared_ptr<T[]>


 

---Finally:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章