C 裡面四種智慧型指標的使用及區別

2021-10-24 15:26:00 字數 3482 閱讀 3591

介紹:c++裡面有四個智慧型指標: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中後三個是c++11支援,並且第乙個已經被11棄用。

智慧型指標的作用?

智慧型指標的作用是用來管理乙個指標。

為麼要使用智慧型指標?

當申請的空間在函式結束時忘記釋放,將會造成記憶體洩漏。而智慧型指標是乙個類,當超出了類的作用域時,類會自動呼叫析構函式,析構函式會自動釋放資源。所以智慧型指標在函式結束時會自動釋放記憶體空間,不需要手動釋放記憶體空間,這樣就避免了記憶體洩漏。

一. auto_ptr(c++98的方案,cpp11已經拋棄)

採用的所有權模式

使用例子:

/*int型*/

int*p=

newint(0

);auto_ptr<

int>

ap(p)

;/*結構體*/

struct a

auto_ptr

apa(

new a)

;apa-

>f(

);

錯誤注意點:

1.因為採用的所有權模式,所以乙個蘿蔔乙個坑,兩個auto_ptr不能同時擁有同乙個物件。例如:

int

*p=new

int(0)

;auto_ptr<

int>

ap1(p)

;auto_ptr<

int>

ap2(p)

;

此時ap1和ap2都認為指標p的所有權歸它們,當在析構時都試圖刪除p, 兩次刪除同乙個物件的行為在c++標準中是未定義的。所以我們必須防止這樣使用auto_ptr.

2.因為auto_ptr的析構函式中刪除指標用的是delete,而不是delete ,所以我們不應該用auto_ptr來管理乙個陣列指標。

int

*pa=

newint[10

];auto_ptr<

int>

ap(pa)

;

3.當智慧型指標被剝奪所有權時,再次使用時會報錯

int

*p=new

int(0)

;auto_ptr<

int>

ap1(p)

;auto_ptr<

int>ap2=ap1;

cout<<

*ap1;

//錯誤,此時ap1只剩乙個null指標在手了

void

f(auto_ptr<

int>ap)

auto_ptr<

int>

ap1(

newint(0

));f

(ap1)

;cout<<

*ap1;

//錯誤,經過f(ap1)函式呼叫,ap1已經不再擁有任何物件了。

總結:在使用auto_ptr指標的時候需要注意一點,乙個auto_ptr的指標只能擁有乙個物件,同時注意不要被剝奪了所有權之後,繼續使用。

二.unique_ptr(替換auto_ptr)

unique_ptr與auto_ptr相比,前者要求更嚴格,實現的是獨佔式擁有或嚴格擁有概念。

int

*p=new

int(0)

;auto_ptr<

int>

ap1(p)

;auto_ptr<

int>ap2 = ap1;

//此時不會報錯

cout <<

*ap1;

//報錯

int*p=

newint(0

);unique_ptr<

int>

ap1(p)

;unique_ptr<

int>ap2=ap1;

//報錯

/*若想做到auto_ptr*/

int*p=

newint(0

);unique_ptr<

int>

ap1(p)

;unique_ptr<

int>ap2=std::

move

(ap1)

;//move轉移擁有權

三. shared_ptr

shared_ptr實現共享式擁有概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在「最後乙個引用被銷毀」時候釋放。使用計數機制來表明資源被幾個指標共享。可以通過成員函式use_count()來檢視資源的所有者個數。

成員函式:

use_count 返回引用計數的個數

unique 返回是否是獨佔所有權( use_count 為 1)

swap 交換兩個 shared_ptr 物件(即交換所擁有的物件)

reset 放棄內部物件的所有權或擁有物件的變更, 會引起原有物件的引用計數的減少

get 返回內部物件(指標)

使用例項:

#include

#include

using

namespace std;

classa;

~a()

};intmain()

四:weak_ptr

weak_ptr 是一種不控制物件生命週期的智慧型指標, 指向乙個 shared_ptr 管理的物件。weak_ptr 設計的目的是為配合 shared_ptr 而引入的一種智慧型指標來協助 shared_ptr 工作, 它只可以從乙個 shared_ptr 或另乙個 weak_ptr 物件構造, 它的構造和析構不會引起引用記數的增加或減少。weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。它是對物件的一種弱引用,不會增加物件的引用計數,和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,它可以通過呼叫lock函式來獲得shared_ptr。

使用例項:

/*share_ptr死鎖問題,導致計數不為0*/

classb;

classa}

;classb}

;void

fun(

)int

main()

/*修改,將share_ptr互相引用換成weak_ptr,避免死鎖問題*/

classb;

classa}

;classb}

;void

fun(

)int

main()

注意:不能通過weak_ptr直接訪問物件的方法,要先將weak_ptr轉化為shared_ptr。

C 四種智慧型指標詳解

c 裡面的四個智慧型指標 shared ptr,unique ptr,weak ptr,auto ptr其中前三個是c 11支援,並且最後乙個已經被11棄用。智慧型指標的使用 智慧型指標主要用於管理在堆上分配的記憶體,它將普通的指標封裝為乙個棧物件。當棧物件的生存週期結束後,會在析構函式中釋放掉申請...

四種智慧型指標剖析

個人部落格傳送門 智慧型指標是c 中乙個程式設計技巧。它保證記憶體的正確釋放,解決了記憶體洩漏的問題。有乙個思想叫做raii,raii指的是資源分配即初始化。我們通常會定義乙個類來封裝資源的分配和釋放,在建構函式中完成資源的分配和初始化,在析構函式中完成資源的清理。在c 中,我們一般是使用new和d...

stl的四種智慧型指標

第一種 std auto ptr auto ptr是所有權轉移的智慧型指標,也就是同一時刻只有乙個智慧型指標物件對原物件擁有所有權。第二種 std scoped ptr scoped ptr智慧型指標無法使用乙個物件建立另乙個物件,也無法採用賦值的形式。這無疑提公升了智慧型指標的安全性,但是又存在無...