一、關鍵
每個shared_ptr所指向的對象都有一個引用計數,它記錄了有多少個shared_ptr指向自己
shared_ptr的析構函數:遞減它所指向的對象的引用計數,如果引用計數變爲0,就會銷燬對象並釋放相應的內存
引用計數的變化:決定權在shared_ptr,而與對象本身無關
二、引用計數初步
1 2 3 4 5 |
|
注:sp.use_count()函數返回sp所指對象的引用計數
三、引用計數增加的情況
拷貝一個shared_ptr,其所指對象的引用計數會遞增,如:
- 用一個shared_ptr初始化另一個shared_ptr
- 用一個shared_ptr給另一個shared_ptr賦值
- 將shared_ptr作爲參數傳遞給一個函數
- shared_ptr作爲函數的返回值
四、引用計數減少的情況
- 給shared_ptr賦予一個新值
- shared_ptr被銷燬(如離開作用域)
五、迷途返航
1. 局部的shared_ptr離開其作用域,它所指對象的引用計數會遞減(-1)
假設:沒有全局的shared_ptr,那麼正確的結果應該是該shared_ptr所指的對象被銷燬
我之前錯誤的想法:多個局部shared_ptr共同指向同一個對象,那麼該對象的引用計數就>1,該函數結束時對象的引用計數減1(但仍>0),那麼該對象不應該被銷燬。
糾正想法:既然是多個局部shared_ptr指向該對象,那麼函數結束時對象的引用計數就不應該只減1啊!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
由代碼證實,函數結束時,引用計數減2,而非減1!