回憶記錄之C 智慧型指標

2021-10-09 19:22:40 字數 2335 閱讀 2931

智慧型指標,顧名思義,它是指標,但是比普通指標更優秀,因為它有「智慧型」。對於普通指標,動態申請堆記憶體後忘記釋放,就會發生記憶體洩漏。而智慧型指標能夠幫助管理動態記憶體,防止發生記憶體洩漏,這是因為智慧型指標借鑑了類的析構函式的思想。對於類來說,當該類的物件過期時,會自動呼叫其析構函式,釋放資源。智慧型指標使用這一概念,使得智慧型指標在過期後,能夠自動釋放其指向的記憶體。因此,智慧型指標式行為類似於指標的類物件。智慧型指標有4種,分別是auto_ptr(一般棄用),unique_ptr,shared_ptr以及weak_ptr。

下圖定義了普通指標p和q,指向同一塊記憶體,如果釋放了p之後再次釋放q,將對同一塊記憶體釋放兩次,這會導致程式崩潰。這個問題可以是用深複製來解決,但這會產生乙個值相同的副本。

1.a 普通指標分配記憶體

1.b 多次釋放同一塊記憶體導致的崩潰

智慧型指標建立了「所有權」的概念,即只有擁有物件「所有權」的智慧型指標才能呼叫相應的析構函式釋放記憶體,這避免了對同一塊記憶體的多次釋放,如auto_ptr和unique_ptr;更高智慧型的智慧型指標使用引用計數,跟蹤對特定物件的引用次數,如shared_ptr。

如果使用auto_ptr,可以防止指向同乙個物件的指標都使用析構函式刪除該物件,但仍然會產生一些問題。如圖2所示,賦值操作使得q指標接過了p對於物件的所有權,如果再次使用p,則會出現問題。這種**不確定的行為可能是棄用auto_ptr的主要原因之一,而且只能程式執行才能發現錯誤,當程式很龐大時找出這種錯誤會很麻煩。

2 auto_ptr的不確定行為導致程式崩潰

如果將使用unique_ptr,則可以避免不確定行為的**出現,因為編譯器不允許留下已經失去物件所有權而成為懸掛指標的智慧型指標,故上述**在賦值語句處會提示錯誤。除非該智慧型指標是乙個很快被銷毀的臨時變數,或者使用移動建構函式。如:

unique_ptr<

int>p=unique_ptr<

int>

(new

int(5)

);unique_ptr<

int>q1(

newint(6

));unique_ptr<

int>q2=

move

(q1)

;

這裡有乙個小問題:再次訪問q1也會出現問題,和auto_ptr一樣。書上說這時因為使用非智慧型的方式(如解除引用)使用了遺棄的智慧型指標,只有重新對q1賦新值再使用才是安全地重用這種指標(mmp,翻過來翻過去都是你說了算)。但unique_ptr能夠區分出是否安全,因為使用了移動建構函式和右值引用,待我再研究研究。

shared_ptr使用引用計數,對於特定的物件,每增加乙個指向該物件的指標,引用數+1;某一指標過期時,引用數-1。最後乙個指標才能使用析構函式,所以可以愉快的玩耍了。

shared_ptr<

int>p(

newint(5

));shared_ptr<

int>q=p;

shared_ptr<

int>r=p;

cout<<

*p<<

"\t"

<<

*q<<

"\t"

<<

*r<

總之,shared_ptr適合有多個指向同一物件的指標的情況,否則,就使用unique_ptr。至於auto_ptr,就讓它一邊兒玩去吧。

筆試題是關於shared_ptr的,但是我做錯了,

我當時給的答案是:a b ~ b ~ a,

程式執行的答案是a b,

它不呼叫析構函式嗎?。

希望哪位網友爸爸好心解釋一下~

請教了一下別人,這裡是智慧型指標的迴圈引用,引用計數減不到0,無法呼叫析構函式。使用weak_ptr能解決這個問題,將結構體a或b中的shared_ptr替換為weak_ptr就能正確呼叫析構函式。但奇怪的現象是:如果單純修改了a,輸出結果是:a b ~b ~a,其中pa的引用計數是2,pb的是1;如果單純修改了b,輸出結果是:a b ~a ~b,其中pa的引用計數是1,pb的是2;如果兩個都修改,輸出結果是:a b ~b ~a,其中pa和pb的引用計數都是1。這又是為何啊!!!

C 智慧型指標個人記錄

shared ptr允許多個指標指向同乙個物件,unique ptr則 獨佔 所指向的物件。標準庫還定義了一種名為weak ptr的伴隨類,它是一種弱引用,指向shared ptr所管理的物件,這三種智慧型指標都定義在memory標頭檔案中。不可以用shared ptr或者weak ptr指向乙個u...

C 之智慧型指標

本文發表於1999年10月份的c c users journal,17 10 1.為什麼稱它為 自動 指標?auto ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的 服務。可以把標準c auto ptr看作智慧型指標的ford...

C 之智慧型指標

c 中有四個智慧型指標 auto ptr,shared ptr,weak ptr,unique ptr,其中後三個是c 11支援,並且第乙個已經被c 11棄用。智慧型指標從書面意思來說,就是智慧型。主要是動態記憶體的使用很容易出問題,要在正確的時間正確釋放記憶體是很困難的。有時我們可能忘了釋放記憶體...