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