C++智能指針

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)引用的問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容