1、智能指針的實現(xiàn)原理:
智能指針是一個類,且這個類是個模板類,為了適應不同基本類型的需求,它在構(gòu)造函數(shù)中傳入一個普通指針,將這個基本類型指針封裝為類對象指針,并在析構(gòu)函數(shù)中釋放這個指針,刪除該指針指向的內(nèi)存空間。因為一般使用時,智能指針的類都是局部對象,所以當函數(shù)(或程序)自動結(jié)束時會自動被釋放。
2、 常用的智能指針:
STL一共提供了四種智能指針:auto_ptr,unique_ptr,shared_ptr和weak_ptr。
所有的智能指針類都有一個explicit構(gòu)造函數(shù)(阻止不應該允許的經(jīng)過轉(zhuǎn)換構(gòu)造函數(shù)進行的隱式轉(zhuǎn)換的發(fā)生,即不能在隱式轉(zhuǎn)換中使用),因此不能直接將指針轉(zhuǎn)換為只能指針對象,必須顯式調(diào)用。
1)std::auto_ptr:屬于獨占內(nèi)存的方式,當p1=p2;時,p2的內(nèi)存使用權(quán)轉(zhuǎn)移給p1(p1指向p2之前所指向的地址),p2成為空懸指針(指針地址為0),若之后使用p2,可以編譯通過,但運行時會出現(xiàn)內(nèi)存訪問錯誤,不安全,會出現(xiàn)內(nèi)存崩潰的問題。也因此不能被放入容器中(C++11已將其摒棄)
2)C++引入的unique_ptr,也屬于獨享內(nèi)存所有權(quán),但優(yōu)于auto_ptr,拷貝構(gòu)造函數(shù)和賦值函數(shù)只有聲明沒有定義,且為私有函數(shù),不能使用。直接賦值會編譯出錯。需要賦值的時候用std::move。
3)shared_ptr(boost、C++11)屬于共享內(nèi)存,內(nèi)部有引用計數(shù)機制(實現(xiàn)方式有兩種,一種是輔助類,一種是句柄類),對一個內(nèi)存對象進行引用計數(shù),當刪除其中一個指向該內(nèi)存的指針時,引用計數(shù)減1,但并不會釋放該內(nèi)存對象,只有當該內(nèi)存對象的引用計數(shù)減為0時,才會釋放該塊內(nèi)存,避免了指針空懸、內(nèi)存訪問錯誤的情況。
4)weak_ptr(boost、C++11)為shared_ptr設計,弱引用。只對shared_ptr進行引用,但不改變其計數(shù);所以,當被引用的shared_ptr失效后,相應的weak_ptr也會失效。weak_ptr 主要用在軟件架構(gòu)設計中,可以在基類(此處的基類并非抽象基類,而是指繼承于抽象基類的虛基類)中定義一個 boost::weak_ptr,用于指向子類的boost::shared_ptr,這樣基類僅僅觀察自己的 boost::weak_ptr 是否為空就知道子類有沒對自己賦值了,而不用影響子類 boost::shared_ptr 的引用計數(shù),用以降低復雜度,更好的管理對象