日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++中各种智能指针的实现及弊端(五)

發布時間:2024/4/11 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中各种智能指针的实现及弊端(五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C++中各種智能指針的實現及弊端(五)

文章目錄

    • C++中各種智能指針的實現及弊端(五)
    • 一、std::shared_ptr的循環引用
    • **二、循環引用分析:**
    • 三、解決方法:
    • 四、weak_ptr解決的原理(圖片中詳細內容)
    • 五、上面所有的智能指針都沒有寫刪除器,因為其所管理的資源不都是new出來的,所以得寫一個刪除器**
    • 六、C++11和boost中智能指針的關系**

一、std::shared_ptr的循環引用

struct ListNode {int _data;shared_ptr<ListNode> _prev;shared_ptr<ListNode> _next;~ListNode(){ cout << "~ListNode()" << endl; } };int main() {shared_ptr<ListNode> node1(new ListNode);shared_ptr<ListNode> node2(new ListNode);cout << node1.use_count() << endl;cout << node2.use_count() << endl;node1->_next = node2;node2->_prev = node1;cout << node1.use_count() << endl;cout << node2.use_count() << endl;return 0; }

上面的代碼出現的問題是資源泄漏,因為node1和node2都沒有釋放掉;

二、循環引用分析:

  • node1和node2兩個智能指針對象指向兩個節點,引用計數變成1,我們不需要手動delete。
  • node1的_next指向node2,node2的_prev指向node1,引用計數變成2。
  • node1和node2析構,引用計數減到1,但是_next還指向下一個節點。但是_prev還指向上一個節點。
  • 也就是說_next析構了,node2就釋放了。
  • 也就是說_prev析構了,node1就釋放了。
  • 但是_next屬于node的成員,node1釋放了,_next才會析構,而node1由_prev管理,_prev屬于node2成員,所以這就叫循環引用,誰也不會釋放。
  • 三、解決方法:

    采用weak_ptr來解決循環引用問題;

  • weak_ptr的作用只有一個,就是搭配shared_ptr來解決循環引用問題
  • weak_ptr的原理是和shared_ptr類似,采用引用計數的方法
  • 注意weak_ptr的對象不能單獨管理資源,作用就只有一個
  • // 解決方案:在引用計數的場景下,把節點中的_prev和_next改成weak_ptr就可以了 // 原理就是,node1->_next = node2;和node2->_prev = node1; //時weak_ptr的_next和_prev不會增加node1和node2的引用計數。 struct ListNode {int _data;weak_ptr<ListNode> _prev;weak_ptr<ListNode> _next;~ListNode(){ cout << "~ListNode()" << endl; } };int main() {shared_ptr<ListNode> node1(new ListNode);shared_ptr<ListNode> node2(new ListNode);cout << node1.use_count() << endl;cout << node2.use_count() << endl;node1->_next = node2;node2->_prev = node1;cout << node1.use_count() << endl;cout << node2.use_count() << endl;return 0; }

    四、weak_ptr解決的原理(圖片中詳細內容)



    五、上面所有的智能指針都沒有寫刪除器,因為其所管理的資源不都是new出來的,所以得寫一個刪除器**

    // 仿函數的刪除器 template<class T> struct FreeFunc {void operator()(T* ptr){cout << "free:" << ptr << endl;free(ptr);} };template<class T> struct DeleteArrayFunc {void operator()(T* ptr){cout << "delete[]" << ptr << endl;delete[] ptr;} };int main() {FreeFunc<int> freeFunc;shared_ptr<int> sp1((int*)malloc(4), freeFunc);DeleteArrayFunc<int> deleteArrayFunc;shared_ptr<int> sp2((int*)malloc(4), deleteArrayFunc);return 0; }

    六、C++11和boost中智能指針的關系**

  • C++ 98 中產生了第一個智能指針auto_ptr.
  • C++ boost給出了更實用的scoped_ptr和shared_ptr和weak_ptr.
  • C++ TR1,引入了shared_ptr等。不過注意的是TR1并不是標準版。
  • C++ 11,引入了unique_ptr和shared_ptr和weak_ptr。需要注意的是unique_ptr對應boost的scoped_ptr。并且這些智能指針的實現原理是參考boost中的實現的
  • 總結

    以上是生活随笔為你收集整理的C++中各种智能指针的实现及弊端(五)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。