關(guān)鍵點(diǎn)##
RAII機(jī)制
C++操作符重載
參考鏈接##
unique_ptr智能指針##
生命周期###
unique_ptr生命周期,與普通的數(shù)據(jù)類型相同,一旦離開(kāi)作用域,如果其指向?qū)ο螅?br> 就會(huì)將指向的對(duì)象進(jìn)行銷毀。
unique_ptr特點(diǎn)在于其“獨(dú)占”的特點(diǎn),同一時(shí)刻
unique_ptr指向的對(duì)象只能有一個(gè)引用,不能存在多個(gè)unique_ptr指向同一個(gè)對(duì)象
。
基本操作###
//后期綁定
unique_ptr<int> ui;
ui.reset(new int(1));
//創(chuàng)建時(shí)動(dòng)態(tài)綁定
unique_ptr<int> ui2(new int(1));
//釋放所有權(quán)
int* pi = ui2.release();
//轉(zhuǎn)移所有權(quán)
unique_ptr<string> us(new string("abc"));
unique_ptr<string> us2 = std::move(us);
//主動(dòng)銷毀
us2 = nullptr
shared_ptr##
生命周期###
shared_ptr生命周期在離開(kāi)作用域時(shí),會(huì)將其指向?qū)ο蟮囊糜?jì)數(shù)減一,
如果發(fā)現(xiàn)引用計(jì)數(shù)已經(jīng)歸〇,那么將會(huì)把其引用的對(duì)象進(jìn)行進(jìn)行銷毀。
shared_ptr的特點(diǎn)在于“引用計(jì)數(shù)”,每當(dāng)有一個(gè)shared_ptr
指針指向相同的對(duì)象的時(shí)候,將會(huì)把引用計(jì)數(shù)增加1,每當(dāng)指向?qū)ο蟮膕hared_ptr被銷毀時(shí),
將會(huì)把引用計(jì)數(shù)減少1,當(dāng)引用計(jì)數(shù)減少為0時(shí),將會(huì)把對(duì)象銷毀。
基本操作
//創(chuàng)建的時(shí)動(dòng)態(tài)綁定
shared_ptr<int> sp(new int(10));
//通過(guò)拷貝
shared_ptr<int> sp1 = sp;
//停止引用對(duì)象
sp.reset();
//銷毀釋放
sp1 = nullptr;
注意###
由于其使用引用計(jì)數(shù)的方式進(jìn)行引用對(duì)象的釋放,所以可能存在環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu)造成內(nèi)存的泄露。
這種時(shí)候需要使用另一個(gè)智能指針weak_ptr解決這種情況。c++無(wú)法想java那樣自動(dòng)判斷并
釋放環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu),所以在使用上還是得需要小心處理。
由于其內(nèi)部加減引用計(jì)數(shù)不是線程安全,所以在多線程使用時(shí)需要自己添加加鎖操作以保證
其引用計(jì)數(shù)的正確性。
weak_ptr##
生命周期###
嚴(yán)格來(lái)說(shuō),weak_ptr并不像shared_ptr以及unique_ptr一樣存在生命周期這總說(shuō)法,因?yàn)?br>
其內(nèi)部不進(jìn)行引用對(duì)象的釋放,也無(wú)法直接進(jìn)行引用對(duì)象的解引用以及->操作。其如果需要
進(jìn)行引用對(duì)象的操作,需要使用lock函數(shù)獲取一個(gè)shared_ptr指針,然后性shared_ptr一
樣進(jìn)行使用。
weak_ptr的特點(diǎn)在于“輔助”shared_ptr指針的使用,其最大
的作用在于解決shared_ptr環(huán)狀引用的問(wèn)題。
基本操作
//引用對(duì)象
shared_ptr<int> sp(new int(1));
weak_ptr<int> wp(sp);
//判斷是否失效
if (wp.expired())
{
//未失效
//獲取一個(gè)Shared_ptr對(duì)象進(jìn)行使用
shared_ptr<int> sp1 = wp.lock();
*sp1 = 0;
}
else
{
//已經(jīng)失效
}