1. 引用計數(shù)
? ??引用計數(shù)這種計數(shù)是為了防止內(nèi)存泄露而產(chǎn)生的。 基本想法是對于動態(tài)分配的對象,進(jìn)行引用計數(shù),每當(dāng)增加一次對同一個對象的引用,那么引用對象的引用計數(shù)就會增加一次, 每刪除一次引用,引用計數(shù)就會減一,當(dāng)一個對象的引用計數(shù)減為零時,就自動刪除指向的堆內(nèi)存。在傳統(tǒng) C++ 中,『記得』手動釋放資源,總不是最佳實踐。因為我們很有可能就忘記了去釋放資源而導(dǎo)致泄露。 所以通常的做法是對于一個對象而言,我們在構(gòu)造函數(shù)的時候申請空間,而在析構(gòu)函數(shù)(在離開作用域時調(diào)用)的時候釋放空間, 也就是我們常說的 RAII 資源獲取即初始化技術(shù)。C++11 引入了智能指針的概念,使用了引用計數(shù)的想法,讓程序員不再需要關(guān)心手動釋放內(nèi)存。 這些智能指針就包括?std::shared_ptr/std::unique_ptr/std::weak_ptr,使用它們需要包含頭文件?<memory>。
? ??注意:引用計數(shù)不是垃圾回收,引用計數(shù)能夠盡快收回不再被使用的對象,同時在回收的過程中也不會造成長時間的等待, 更能夠清晰明確的表明資源的生命周期。
2.?std::shared_ptr
? ? 成員方法:user_count(),作用是獲得當(dāng)前對象被引用的次數(shù);reset(),作用是釋放指針對象的引用,將指針設(shè)為空;swap(),作用是和另外一個shared_ptr交換引用對象和引用計數(shù);
? ? 線程安全性:同一個share_ptr被多個線程“讀”是安全的;同一個share_ptr被多個線程“寫”是不安全的;共享引用計數(shù)的不同share_ptr被多個線程“寫”是安全的;

3. std::weak_ptr
????std::shared_ptr 使用引用計數(shù), 所以有循環(huán)計數(shù)的問題. 為了打破循環(huán),可以使用std::weak_ptr. 顧名思義.weak_ptr是一個弱引用, 只引用, 不計數(shù). 如果一塊內(nèi)存被shared_ptr和weak_ptr同時引用, 當(dāng)所有shared_ptr析構(gòu)了之后,.不管還有沒有weak_ptr引用該內(nèi)存, 內(nèi)存也會被釋放. 所以weak_ptr不保證它指向的內(nèi)存一定是有效的, 在使用之前需要檢查;
????std::weak_ptr?沒有?*?運(yùn)算符和?->?運(yùn)算符,所以不能夠?qū)Y源進(jìn)行操作,它的唯一作用就是用于檢查?std::shared_ptr?是否存在,其?expired()?方法能在資源未被釋放時,會返回?false,否則返回?true;


4. std::unique_ptr
? ? 是一種獨(dú)占的智能指針,它禁止其它智能指針與其共享同一個對象;從而保證代碼的安全性;