智慧型指標可以通過引用計數的策略自動銷毀物件,其作用不僅僅是偷了一點點懶,而是可以解決一些大型工程難題(尤其是多執行緒環境下物件的銷毀問題).最近開始看
強引用.乙個強引用型別的智慧型指標能增加目標物件的引用計數.
先舉個栗子大概看一下怎麼用:
#includeusing namespace std;
struct node
cout<
這個功能很實用.
在此之前,提一句:智慧型指標的複製建構函式在傳參的時候會使引用計數+1,引數銷毀時-1.
舉個迴圈引用的栗子:
#includeusing namespace std;
struct node
cout<
兩個物件只被建立了,都沒被銷毀,造成了記憶體洩露.
解決方案就是在類成員中使用weak_ptr代替shared_ptr.至於weak_ptr是什麼下面解釋.
weak_ptr(弱引用)是為了配合shared_ptr(強引用)而設計的.它不會增加物件的引用計數,但是可以判斷該物件是否有效(有沒有被銷毀),以及提供對目標物件的訪問.
weak_ptr 沒有過載*和->但可以使用 lock 獲得乙個可用的 shared_ptr 物件. 注意, weak_ptr 在使用前需要檢查合法性.
expired 用於檢測所管理的物件是否已經釋放, 如果已經釋放, 返回 true; 否則返回 false.
lock 用於獲取所管理的物件的強引用(shared_ptr). 如果 expired 為 true, 返回乙個空的 shared_ptr; 否則返回乙個 shared_ptr, 其內部物件指向與 weak_ptr 相同.
use_count 返回與 shared_ptr 共享的物件的引用計數.
reset 將 weak_ptr 置空.
weak_ptr 支援拷貝或賦值, 但不會影響對應的 shared_ptr 內部物件的計數.
weak_ptr 在功能上類似於普通指標, 然而乙個比較大的區別是, 弱引用能檢測到所管理的物件是否已經被釋放, 從而避免訪問非法記憶體。
(成員函式的介紹**於阿hai的部落格)
也就是說,weak_ptr完全是shared的乙個助手,完全沒有人權,只用來解決shared_ptr的迴圈引用問題.
上面迴圈引用的例子裡,只需要把成員變數shared_ptr換成weak_ptr就可以了.不過我們為了看一下weak_ptr怎麼用,給上面的例子裡增加一丟丟操作.
改正後的**:
#includeusing namespace std;
struct node
cout<
智慧型指標筆記
前言智慧型指標是行為類似於指標的類物件。include include using namespace std void fun string str int main system pause return0 void fun string str 可以看出此 中有缺陷,在fun函式中,分配了堆中...
C auto ptr智慧型指標的用法
c auto ptr智慧型指標的用法 c 中指標申請和釋放記憶體通常採用的方式是new和delete。然而標準c 中還有乙個強大的模版類就是auto ptr,它可以在你不用的時候自動幫你釋放記憶體。下面簡單說一下用法。cpp view plain copy 用法一 std auto ptrm exa...
C auto ptr智慧型指標的用法
c auto ptr智慧型指標的用法 c 中指標申請和釋放記憶體通常採用的方式是new和delete。然而標準c 中還有乙個強大的模版類就是auto ptr,它可以在你不用的時候自動幫你釋放記憶體。下面簡單說一下用法。cpp view plain copy print?用法一 std auto pt...