C 智慧型指標計數問題

2021-10-06 19:17:45 字數 1326 閱讀 5935

一、關鍵

每個shared_ptr所指向的物件都有乙個引用計數,它記錄了有多少個shared_ptr指向自己

shared_ptr的析構函式:遞減它所指向的物件的引用計數,如果引用計數變為0,就會銷毀物件並釋放相應的記憶體

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

二、引用計數初步

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,其所指物件的引用計數會遞增,如:

四、引用計數減少的情況

五、迷途返航

1. 區域性的shared_ptr離開其作用域,它所指物件的引用計數會遞減(-1)

假設:沒有全域性的shared_ptr,那麼正確的結果應該是該shared_ptr所指的物件被銷毀

我之前錯誤的想法:多個區域性shared_ptr共同指向同乙個物件,那麼該物件的引用計數就》1,該函式結束時物件的引用計數減1(但仍》0),那麼該物件不應該被銷毀。

糾正想法:既然是多個區域性shared_ptr指向該物件,那麼函式結束時物件的引用計數就不應該只減1啊!!

shared_ptr<int> init()

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

intmain()

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

c 智慧型指標的問題 智慧型指標初探(一)

為什麼要有智慧型指標 在c 中,動態記憶體的管理一般是用一對運算子完成的 new和delete。new 在動態記憶體中為物件分配一塊空間並返回乙個指向該物件的指標。delete 指向乙個動態獨享的指標,銷毀物件,並釋放與之關聯的記憶體。使用new和delete動態記憶體管理經常會出現問題 忘記釋放記...

c 實現引用計數智慧型指標

主要的思路是使用乙個int 的指標進行計數,在建構函式時候設定為0,並加1 或者直接設定為1 然後賦值和複製構造時候把int 和資料儲存的指標t mp傳到另外乙個類中。在賦值的時候要注意左邊的指標是否已經有資料了,有資料就要先 1,然後再進行賦值。template class ref1 ref1 c...

C 智慧型指標的問題

如何回答c 面試中關於智慧型指標的問題?1 什麼是智慧型指標?2 分析下常見的智慧型指標有哪些?3 實現乙個智慧型指標唄?沒具體說寫哪個,建議預設寫 unique ptr 1 答 智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類,用於生存期控制,能夠確保自動正確的銷毀動態...