RAII:C++中一個對象出了其作用域就會被自動析構(gòu),只要在構(gòu)造函數(shù)時候申請空間,析構(gòu)函數(shù)時候釋放空間,圍繞著構(gòu)造和析構(gòu)進行操作。
深拷貝:每一個對象的指針都有指向的內(nèi)存空間,而不是共享,對象析構(gòu)時不存在重復(fù)釋放或者內(nèi)存泄漏的問題;內(nèi)存開銷大
淺拷貝: 通過 拷貝構(gòu)造函數(shù)實例化的對象的指針數(shù)據(jù)變量指向的共享的內(nèi)存空間,內(nèi)存開銷??;對象析構(gòu)時可能會重復(fù)釋放或造成內(nèi)存泄漏。
通過引用計數(shù),減少了內(nèi)存開銷,又避免了堆的重復(fù)釋放或者內(nèi)存泄漏問題
引用計數(shù)復(fù)用了深拷貝和淺拷貝的優(yōu)點,避免了缺點,同時帶來了新的問題:
? ? 1 其中某一個對象中資源進行了修改,所有引用該資源的對象全部被修改
? ? 2復(fù)用性不好
使用寫時拷貝解決問題:共享資源發(fā)送變化時,對資源進行拷貝,修改拷貝的值,不影響原有的對象的共享資源。
智能指針:
? ? 用起來像指針,會自己對資源進行釋放;將資源放入智能指針類中,管理起來
shared_ptr:
????共享的智能指針,每一個shared_ptr的拷貝都指向相同的內(nèi)存,最后一個shared_ptr析構(gòu)的時候,內(nèi)存才會被釋放。
????可以通過構(gòu)造函數(shù),std_make_shared輔助函數(shù)和reset方法來初始化shared_ptr;
unique_ptr:
????獨占的智能指針,不允許其他職能指針共享內(nèi)部的指針,不允許通過賦值將一個unique_ptr賦值給另外一個unique_ptr;不允許復(fù)制,可以通過函數(shù)返回給其他的unique_ptr,還可以通過move轉(zhuǎn)移到其他的unqiue_ptr,這樣它本身就不在擁有原來指針的所有權(quán)了。
????若希望只有一個智能指針管理資源或者管理數(shù)組就是有unique_ptr,如果希望多個智能指針管理同一個資源就用shared_ptr。
weak_ptr:
????弱引用的智能指針, 此指針用來監(jiān)視share_ptr,不會使引用計數(shù)加1,它不管理shared_ptr內(nèi)部的指針,主要為了監(jiān)視shared_ptr的生命周期,更像是shread_ptr的一個助手。
? ? weak_ptr沒有重載運算符*和->,因為他不共享指針,不能操作資源,主要通過shared_ptr獲得資源的檢測權(quán),構(gòu)造不會增加引用計數(shù),釋放不會減少引用計數(shù),純粹作為一個旁觀者監(jiān)視shared_ptr中關(guān)聯(lián)的資源是否存在。
? ? 還可以用來返回this指針和解決循環(huán)引用的問題。