0.shared_ptr和weak_ptr的實現方案
說明:該方案徹底是我本身YY出來的,是爲了方便本身的理解智能指針的。另外,也幫助理解enable_shared_from_this。
1.背景
爲了方便管理動態分配的內存,讓申請的內存自動釋放,天才們提出了智能指針的方法。
既然你創造了一種新的技術,老的問題必將以新的形態出現。
這裏我指關注一個問題:
如何使用智能指針?
1.1 基本使用(shared_ptr)
1.2 監控使用(shared_ptr)
1.3 內部使用(enable_shared_from_this)
2.實現
shared_ptr(每一個都包含有指向Counter的指針)
|
|
|
Counter(包含shared_ptr和weak_ptr分別的計數,還包含「內存指針」)
|
weak_ptr(每一個都包含有指向Counter的指針)
|
|
|
enable_shared_from_this(繼承該類的子類對象都包含了一個weak_ptr)
|
2.1 shared_ptr
- 只有第一個shared_ptr才生成一個Counter,並將內存指針放到Counter中,shared_ptr計數+1 。
- 以後又新的針對該內存指針的shared_ptr,都必須拷貝的方式得到指向Counter的指針,而且shared_ptr計數+1 。
- 每銷燬一個shared_ptr的時候,Counter的shared_ptr計數-1,當shared_ptr計數爲0時,銷燬內存
- 當shared_ptr計數和weak_ptr計數同時爲0時,銷燬Counter
2.2 weak_ptr
- 當shared_ptr計數>0的時候,能夠經過weak_ptr得到一個shared_ptr,固然shared_ptr計數+1 。
- 沒銷燬一個weak_ptr的時候,weak_ptr計數-1,
- 當shared_ptr計數和weak_ptr計數同時爲0時,銷燬Counter
2.3 Counter
- 存放了shared_ptr和weak_ptr計數
- 存放了 內存指針
2.4 enable_shared_from_this
- 當繼承該類的子類對象指針構造shared_ptr的時候,該對象能夠得到一個weak_ptr
- 當該子類對象須要傳遞自身指針給其餘人使用的時候,必須傳遞一個shared_ptr