C 11 shared ptr(智慧型指標)詳解

2021-10-23 13:17:06 字數 1867 閱讀 9525

要確保用 new 動態分配的記憶體空間在程式的各條執行路徑都能被釋放是一件麻煩的事情。c++ 11 模板庫的 標頭檔案中定義的智慧型指標,即 shared _ptr 模板,就是用來部分解決這個問題的。

只要將 new 運算子返回的指標 p 交給乙個 shared_ptr 物件「託管」,就不必擔心在**寫delete p語句——實際上根本不需要編寫這條語句,託管 p 的 shared_ptr 物件在消亡時會自動執行delete p。而且,該 shared_ptr 物件能像指標 p —樣使用,即假設託管 p 的 shared_ptr 物件叫作 ptr,那麼 *ptr 就是 p 指向的物件。

通過 shared_ptr 的建構函式,可以讓 shared_ptr 物件託管乙個 new 運算子返回的指標,寫法如下:

shared_ptr

ptr(

new t)

;// t 可以是 int、char、類等各種型別

此後,ptr 就可以像 t* 型別的指標一樣使用,即 *ptr 就是用 new 動態分配的那個物件。

多個 shared_ptr 物件可以共同託管乙個指標 p,當所有曾經託管 p 的 shared_ptr 物件都解除了對其的託管時,就會執行delete p。

例如下面的程式:

#include

#include

using

namespace std;

classa;

~a()

};intmain()

程式的輸出結果如下:

2,2,223

2 destructed

end5 destructed

4 destructed

3 destructed

可以用第 14 行及第 16 行的形式讓多個 shareclptr 物件託管同乙個指標。這多個 shared_ptr 物件會共享乙個對共同託管的指標的「託管計數」。有 n 個 shared_ptr 物件託管同乙個指標 p,則 p 的託管計數就是 n。當乙個指標的託管計數減為 0 時,該指標會被釋放。shared_ptr 物件消亡或託管了新的指標,都會導致其原託管指標的託管計數減 1。

第 20、21 行,shared_ptr 的 reset 成員函式可以使得物件解除對原託管指標的託管(如果有的話),並託管新的指標。原指標的託管計數會減 1。

輸出的第 4 行說明,用 new 建立的動態物件 a(2) 被釋放了。程式中沒有寫 delete 語句,而 a(2) 被釋放,是因為程式的第 23 行執行後,已經沒有 shared_ptr 物件託管 a(2),於是 a(2) 的託管計數變為 0。最後乙個解除對 a(2) 託管的 shared_ptr 物件會釋放 a(2)。

main 函式結束時,sp1、sp2、sp3 物件消亡,各自將其託管的指標的託管計數減為 0,並且釋放其託管的指標,於是會有以下輸出:

5 destructed

4 destructed

3 destructed

只有指向動態分配的物件的指標才能交給 shared_ptr 物件託管。將指向普通區域性變數、全域性變數的指標交給 shared_ptr 託管,編譯時不會有問題,但程式執行時會出錯,因為不能析構乙個並沒有指向動態分配的記憶體空間的指標。

注意,不能用下面的方式使得兩個 shared_ptr 物件託管同乙個指標:

a* p =

newa(10

);shared_ptr

sp1(p)

,sp2

(p);

sp1 和 sp2 並不會共享同乙個對 p 的託管計數,而是各自將對 p 的託管計數都記為 1(sp2 無法知道 p 已經被 sp1 託管過)。這樣,當 sp1 消亡時要析構 p,sp2 消亡時要再次析構 p,這會導致程式崩潰。

C 11 shared ptr效率比較

我實現的網路庫中使用了c 11中的shared ptr.昨天做profile,發現很多cpu都消耗在shared ptr上,所以打算看看shared ptr的效率如何.實驗是這樣的,弄乙個臨時的shared ptr,然後不停的拷貝,拷貝100w次,看消耗多長時間.實驗物件是gcc 4.6.2和cla...

C 11 智慧型指標 shared ptr

shared ptr 是乙個標準的共享所有權的智慧型指標,允許多個指標指向同乙個物件.定義在 memory 檔案中 非memory.h 命名空間為 std.shared ptr 是為了解決 auto ptr 在物件所有權上的侷限性 auto ptr 是獨佔的 在使用引用計數的機制上提供了可以共享所有...

C 11 shared ptr概念及用法

c 11模板庫 include shared ptrptr new t t 可以是 int char 類等各種型別gnu g 的標準庫中還沒有支援,需使用boost include每個 shared ptr 物件在內部指向兩個記憶體位置 ptr.use count 1 使用空引數建構函式構造 std...