c++智能指針介紹_補充

不明白我作錯了什麼,這幾天老婆給我冷戰了起來,也不給我開視頻讓我看娃了。。哎,心累!趁着今晚的一些空閒時間來對智能指針作個補充吧。函數

 

寫完上篇「智能指針介紹」後,次日上班途中時,忽然一個疑問盤踞在心頭,感受上篇文章介紹的有些缺陷或者遺漏。spa

問題引入:當兩個智能指針引用同一個heap obj,那麼當一個智能指針跳出其scope時,另外一個智能指針是怎麼知道所引用heap obj的引用數量(use_count)如今變成了1?指針

                   若是引用計數是「智能指針類」內部的一個member var,那麼其會隨着該智能指針而消失,對吧?可是另外一個智能指針所擁有的獨立的引用計數(member var)不該該知道要減一纔對啊!視頻

 

Android如何實現?對象

拋出這個問題後,回顧下Android實現的智能指針(更準確說是強弱指針:StrongPoint/WeakPoint即sp/wp)使用方式:sp<XYZ> sp_obj = new XYZ();繼承

安卓中的智能指針所引用的類都有一個要求:XYZ必須從RefBase繼承而來,引用計數在基類RefBase中實現。內存

所以XYZ類對象被多個sp_obj_x所引用時,由於各個sp_obj_x都能訪問和修改XYZ類內部的同一個引用計數器,所以能夠容易知道何時真正釋放這個XYZ類對象(heap obj)。資源

使用者只需sp<XYZ> sp_obj = new XYZ();構造這個對象,回收不用管了(不用手動delete),利用OS系統在函數堆棧調用切換來自動回收這塊heap內存。get

用機器去作事情咱們能夠放心,由於它不會犯錯。相反,人作事情經常丟三落四。class

 

答案介紹:

若是兩個智能指針想知道彼此釋放資源與否,那麼這兩個智能指針之間必須可以「互相通訊」,所以內部的「引用計數」就不能被單個類共享!

如何讓兩個stack obj可以分享信息呢?除了共同引用的heap obj(若是其內部有個ref_cnt,也能夠作到,相似與安卓的只能指針)外,只有那個「引用計數」了,其必須是動態內存!

也便是,當第一次引用資源(那個heap obj)時,也即第一個shared_ptr進行構造時,其除了一個內部變量保存這個堆指針外,還需new一塊內存,這塊內存用於引用計數管理(其內部的ref_cnt先加1);

當第二引用同一個資源時,即進行拷貝構造(shared_ptrconst shared_ptr& r ))時,其除了會引用共同的資源外,還會引用上次new出的那個內存塊,而且將ref_cnt再加1,變成2。

這能夠解釋釋放第一個智能指針後,第二個智能指針能夠知道所管理的資源的引用數量了。

 

其它補充:

1.use_count()至關於sp的getStrongCount().

2.weak_ptr的lock()至關於wp的promote(),先得到資源全部權,再判斷資源有效性。

3.get()都用於取得所管理的資源的地址。

4.reset()和=NULL(即operator =)都是解除該智能指針對資源的引用,但不必定真正釋放資源(同時還被其餘智能指針引用)。

5.都重載了->和*,用於訪問其管理的資源。

 

就先說這麼多吧,之後想起來了再補充。

相關文章
相關標籤/搜索