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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

【C++】智能指针简述(五):解决循环引用的weak_ptr

發(fā)布時(shí)間:2024/4/15 c/c++ 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】智能指针简述(五):解决循环引用的weak_ptr 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

  總結(jié)一下前文內(nèi)容:

  1.智能指針通過(guò)RAII方法來(lái)管理指針:構(gòu)造對(duì)象時(shí),完成資源初始化;析構(gòu)對(duì)象時(shí),對(duì)資源進(jìn)行清理及汕尾.

  2.auto_ptr,通過(guò)“轉(zhuǎn)移所有權(quán)”來(lái)防止析構(gòu)一塊內(nèi)存多次.(如何轉(zhuǎn)移?詳情看第二篇文章)

  3.scoped_ptr,不“轉(zhuǎn)移所有權(quán)”而是禁止拷貝/賦值對(duì)象.(C++如何禁止拷貝對(duì)象?詳情看第三篇文章)

  4.shared_ptr,通過(guò)"引用計(jì)數(shù)"的方法,來(lái)完成對(duì)象的拷貝/賦值.(引用計(jì)數(shù)怎么實(shí)現(xiàn)?詳情看上篇文章)

  大致總結(jié)了一下前文后,我們開始討論今天的內(nèi)容:解決智能指針的循環(huán)引用問(wèn)題!

  我們先來(lái)看一下這樣的場(chǎng)景:

template<typename T> struct ListNode{T _value;std::shared_ptr<ListNode> _prev;std::shared_ptr<ListNode> _next;ListNode(const T & value):_value(value),_prev(NULL),_next(NULL){}~ListNode(){std::cout<<"~ListNode()"<<std::endl;} };void TestWeekPtr(){std::shared_ptr<ListNode<int>> sp1(new ListNode<int>(10)); std::shared_ptr<ListNode<int>> sp2(new ListNode<int>(20));sp1->_next = sp2;sp2->_prev = sp1;//構(gòu)成死鎖,出了函數(shù)作用域,也沒(méi)有調(diào)用析構(gòu)函數(shù)std::cout<<sp1.use_count()<<std::endl; //sp1的引用計(jì)數(shù)std::cout<<sp2.use_count()<<std::endl; //sp2的引用計(jì)數(shù) }

  sp1指向sp2、sp2又指向sp1,這種情況,就好像兩個(gè)人打架:互相抓住對(duì)方耳朵,A說(shuō)你先松手,你不松我就不松;B說(shuō)你先松,你不松我也不松.就這樣一直僵持著.....

  那么,我們?nèi)绾谓鉀Q這樣的問(wèn)題呢?

  用weak_ptr!!!

template<typename T> struct ListNode{T _value;weak_ptr<ListNode> _prev;weak_ptr<ListNode> _next;ListNode(const T & value):_value(value),_prev(NULL),_next(NULL){}~ListNode(){std::cout<<"~ListNode()"<<std::endl;} }; void TestWeekPtr(){std::shared_ptr<ListNode<int>> sp1(new ListNode<int>(10)); std::shared_ptr<ListNode<int>> sp2(new ListNode<int>(20));sp1->_next = sp2;sp2->_prev = sp1;std::cout<<sp1.use_count()<<std::endl;std::cout<<sp2.use_count()<<std::endl; }

  那么為什么用weak_ptr就可以解決循環(huán)引用的問(wèn)題,簡(jiǎn)單點(diǎn)的來(lái)說(shuō):weak_ptr的構(gòu)造和析構(gòu)不會(huì)引起引用計(jì)數(shù)的增加或減少.

  最后,作為補(bǔ)充:weak_ptr必須與shared_ptr配合使用,不能單獨(dú)使用.

轉(zhuǎn)載于:https://www.cnblogs.com/qq329914874/p/6661578.html

總結(jié)

以上是生活随笔為你收集整理的【C++】智能指针简述(五):解决循环引用的weak_ptr的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。