介紹: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智慧型指標無法使用乙個物件建立另乙個物件,也無法採用賦值的形式。這無疑提公升了智慧型指標的安全性,但是又存在無...