C++智能指針計數問題

一、關鍵

每個shared_ptr所指向的對象都有一個引用計數,它記錄了有多少個shared_ptr指向自己

shared_ptr的析構函數:遞減它所指向的對象的引用計數,如果引用計數變爲0,就會銷燬對象並釋放相應的內存

引用計數的變化:決定權在shared_ptr,而與對象本身無關

 

二、引用計數初步

1

2

3

4

5

shared_ptr<int> sp;                       //空智能指針

shared_ptr<int> sp2 = make_shared<int>(3);

shared_ptr<int> sp3(sp2);

cout << sp.use_count() << endl;         //輸出0

cout << sp2.use_count() << endl;        //輸出2

注: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

shared_ptr<int> init()

{

    shared_ptr<int> sp2 = make_shared<int>(3);

    shared_ptr<int> sp3(sp2);

    cout << sp2.use_count() << endl;        //輸出2

    return sp2;                       //返回sp2,故引用計數遞增,變爲3

}                                //sp2和sp3離開作用域,引用計數減2,變爲1

 

int main()

{

    auto p = init();                        //此處賦值的拷貝與return處的拷貝是一致的

    cout << p.use_count() << endl;          //輸出1

    return 0;

}

由代碼證實,函數結束時,引用計數減2,而非減1!

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