關(guān)鍵點##
RAII機(jī)制
C++操作符重載
參考鏈接##
unique_ptr智能指針##
生命周期###
unique_ptr生命周期,與普通的數(shù)據(jù)類型相同,一旦離開作用域菩收,如果其指向?qū)ο螅?br> 就會將指向的對象進(jìn)行銷毀。
unique_ptr特點在于其“獨占”的特點鳞陨,同一時刻
unique_ptr指向的對象只能有一個引用,不能存在多個unique_ptr指向同一個對象
瞻惋。
基本操作###
//后期綁定
unique_ptr<int> ui;
ui.reset(new int(1));
//創(chuà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);
//主動銷毀
us2 = nullptr
shared_ptr##
生命周期###
shared_ptr生命周期在離開作用域時厦滤,會將其指向?qū)ο蟮囊糜嫈?shù)減一,
如果發(fā)現(xiàn)引用計數(shù)已經(jīng)歸〇歼狼,那么將會把其引用的對象進(jìn)行進(jìn)行銷毀掏导。
shared_ptr的特點在于“引用計數(shù)”,每當(dāng)有一個shared_ptr
指針指向相同的對象的時候羽峰,將會把引用計數(shù)增加1趟咆,每當(dāng)指向?qū)ο蟮膕hared_ptr被銷毀時,
將會把引用計數(shù)減少1梅屉,當(dāng)引用計數(shù)減少為0時忍啸,將會把對象銷毀。
基本操作
//創(chuàng)建的時動態(tài)綁定
shared_ptr<int> sp(new int(10));
//通過拷貝
shared_ptr<int> sp1 = sp;
//停止引用對象
sp.reset();
//銷毀釋放
sp1 = nullptr;
注意###
由于其使用引用計數(shù)的方式進(jìn)行引用對象的釋放履植,所以可能存在環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu)造成內(nèi)存的泄露。
這種時候需要使用另一個智能指針weak_ptr解決這種情況悄晃。c++無法想java那樣自動判斷并
釋放環(huán)狀鏈?zhǔn)浇Y(jié)構(gòu)玫霎,所以在使用上還是得需要小心處理。
由于其內(nèi)部加減引用計數(shù)不是線程安全妈橄,所以在多線程使用時需要自己添加加鎖操作以保證
其引用計數(shù)的正確性庶近。
weak_ptr##
生命周期###
嚴(yán)格來說,weak_ptr并不像shared_ptr以及unique_ptr一樣存在生命周期這總說法眷蚓,因為
其內(nèi)部不進(jìn)行引用對象的釋放鼻种,也無法直接進(jìn)行引用對象的解引用以及->操作。其如果需要
進(jìn)行引用對象的操作沙热,需要使用lock函數(shù)獲取一個shared_ptr指針叉钥,然后性shared_ptr一
樣進(jìn)行使用。
weak_ptr的特點在于“輔助”shared_ptr指針的使用篙贸,其最大
的作用在于解決shared_ptr環(huán)狀引用的問題投队。
基本操作
//引用對象
shared_ptr<int> sp(new int(1));
weak_ptr<int> wp(sp);
//判斷是否失效
if (wp.expired())
{
//未失效
//獲取一個Shared_ptr對象進(jìn)行使用
shared_ptr<int> sp1 = wp.lock();
*sp1 = 0;
}
else
{
//已經(jīng)失效
}