附錄 | BUG踩坑----智能指針
指針和智能指針

? 在c/c++中有一個很重要的概念,管理內(nèi)存地址,即手動為數(shù)據(jù)分配內(nèi)存,從而誕生了指針這一概念。
? 指針是一個變量,其存儲的是值的地址。

? 我們在聲明了一個指針變量后,會在自由存儲區(qū)為該變量開辟內(nèi)存空間,以供后來使用。
? 指針的強大之處在于它可以自由的分配和管理內(nèi)存,但也因此容易引發(fā)內(nèi)存泄漏的問題。
? 所謂的內(nèi)存泄露,指的是不再使用的內(nèi)存空間,未被及時的釋放和回收。
? 大約有以下幾種內(nèi)存泄露的情況:
為指針分配堆中的內(nèi)存,但沒有回收。即沒有delete掉這個指針。

在回收指針前,程序因為其他原因提前結(jié)束。比如異常拋出的情況。

沒有將基類的析構(gòu)函數(shù)定義為虛函數(shù)。這種情況主要發(fā)生在聲明了一個基類指向子類的指針被錯誤釋放,而導(dǎo)致的內(nèi)存泄露問題。
野指針:指向指向被釋放的或者訪問受限內(nèi)存的指針。主要原因還是在于空指針沒有被置為NULL。

? 為了有效、方便的避免這些問題,c++11后提出了新的智能指針 shared_ptr、unique_ptr和weak_ptr,這三種智能指針模板類來管理指針。
? 智能指針本質(zhì)上是模板類,是對象,可以將new獲得的地址賦給這種對象,當智能指針過期時,其析構(gòu)函數(shù)將使用delete來釋放內(nèi)存。?

??注意,所有智能指針的構(gòu)造函數(shù)均為 explicit構(gòu)造函數(shù),該關(guān)鍵字作用是取消隱式轉(zhuǎn)換,并且只能有一個參數(shù)(如果其他參數(shù)有初始值也可以)。
? 也就是說,你不能用以下這種方式來賦值指針:


? unique_ptr:
? 它對其所指向的對象擁有獨享權(quán),unique_ptr 不共享它所管理的對象。
? 多個指針無法指向同一個對象。
? 它無法通過直接賦值的方式來傳遞對象,只能通過引用的方式,或者通過 std::move(所有權(quán)轉(zhuǎn)移)的方式來傳遞對象。傳遞完成后,原本的指針將變成空指針。
? 另一種情況,用函數(shù)返回一個 unique_ptr指針也是可以的,因為這個指針是臨時指針,在使用完之后會被自動釋放。但是這需要滿足另一個指針也是 unique_ptr 才可以。

??還有一種情況,在 unique_ptr 為右值時,可以將其賦值給 shared_ptr。這是因為 shared_ptr有一個顯式構(gòu)造函數(shù)。

shared_ptr:
??shared_ptr 是一個標準的共享所有權(quán)的智能指針,允許多個指針指向同一個對象。
? 它含有計數(shù)功能,通過 shared_ptr.use_count()?可以得到當前對象被多少個指針共享。
? 當一個shared_ptr賦值給另一個shared_ptr時,被賦值的指針的原內(nèi)存會被銷毀,回收。