智能指針

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ù),用以降低復雜度,更好的管理對象

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • C++ 智能指針詳解 一、簡介由于 C++ 語言沒有自動內(nèi)存回收機制,程序員每次 new 出來的內(nèi)存都要手動 de...
    yangqi916閱讀 1,387評論 0 2
  • 1. 什么是智能指針? 智能指針是行為類似于指針的類對象,但這種對象還有其他功能。 2. 為什么設計智能指針? 引...
    MinoyJet閱讀 647評論 0 1
  • 原作者:Babu_Abdulsalam 本文翻譯自CodeProject,轉(zhuǎn)載請注明出處。 引入### Ooops...
    卡巴拉的樹閱讀 30,182評論 13 74
  • 導讀## 最近在補看《C++ Primer Plus》第六版,這的確是本好書,其中關(guān)于智能指針的章節(jié)解析的非常清晰...
    小敏紙閱讀 2,021評論 1 12
  • C++智能指針 原文鏈接:http://blog.csdn.net/xiaohu2022/article/deta...
    小白將閱讀 6,901評論 2 21