C++智能指針--(初識智能指針)

在以往的C++中,我們申請釋放資源,有可能忘記去釋放資源而導致泄露。C++11引入了智能指針的概念,使用引用計數的想法,讓程序員不再需要關心手動釋放內存。這些智能指針就包括std::shared_ptrstd::weak_ptrstd::unique_ptr使用他們需要包含頭文件<memory>。

      注意:引用計數不是垃圾回收,引用計數能夠儘快收回不再被使用的對象,同時再回收的過程中也不會造成長時間
的等待,更能夠清晰明確的表明資源的生命週期。

std::shared_ptr

    std::shared_ptr是一種智能指針,他能夠記錄多少個shared_ptr共同指向一個對象,從而消除顯示的調用
delete,當引用計數變爲零的時候就會將對象自動刪除。但還是不夠,因爲使用std::shared_ptr仍然需要使用
new來調用,這使得代碼出現了某種程度上的不對稱。std::make_shared就能夠用來消除顯式的使用new,所以
std::make_shared會分配創建傳入參數中的對象,並返回這個對象型的std::shared_ptr指針。
    std::shared_ptr可以通過get()方法來獲取原始指針,通過reset來減少一個引用計數,並通過use_count()
來查看一個對象的引用計數。
    

std::unique_ptr
 

    std::unique_ptr 是一種獨佔的智能指針,他禁止其他智能指針與其共享同一個對象,從而保證代碼的安全
std::make_unique從C++14引入,make_unique 並不複雜,C++11 並沒有提供std::make_unique, 可以自行實現:

template<typename T, typename ...Args>
std::unique_ptr<T> make_quique( Args&& ...args) {
    return std::unique_ptr<T>( new T(std::forward<Args>(args)...));
}

既然是獨佔,換句話說就是不可複製。但是,我們可以利用std::move將其轉移給其他的unique_ptr。

std::weak_ptr
當std::shared_ptr存在資源無法釋放的問題。解決這個問題的辦法就是使用弱引用指針std::weak_ptr,std::weak_ptr是一種弱引用(相比較而言std::shared_ptr就是一種強引用)。弱引用不會引起引用計數增加。

    std::weak_ptr沒有*運算符和->運算符,所以不能夠對資源進行操作,它的唯一作用就是用於檢查std::shared_ptr
是否存在,其expired()方法能在資源未被釋放時,會返回true。否則返回false。

總結

智能指針這種技術並不新奇,在很多語言中都是一種常見的技術,C++1x將這項計數引進,在一定程度上消除了
new/delete的濫用,是一種更加成熟的編程範式。

參考資料:

    《深入理解C++11》

    《高速上手C++11/14/17》

相關書籍下載地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章