weak_ptr的作用及应用场景——shared_ptr的循环引用问题 £神魔★判官ぃ 2022-07-18 01:22 176阅读 0赞 weak\_ptr 是为了辅助shared\_ptr而引入的一种智能指针,它存在的意义就是协助shared\_ptr更好的完成工作,我们可以把它比做成一个秘书或助理。 weak\_ptr的构造和析构并不会改变引用计数的大小,它可以由一个shared\_ptr或weak\_ptr的对象构造获得。它没有对“\*”和“->”的重载,但可以使用lock获得一个可用的shared\_ptr对象。 当面试官问到weak\_ptr智能指针的时候,你可以举出一个场景来说明它的作用 场景--------------解决shared\_ptr的循环引用问题 我们知道,智能指针shared\_ptr采用的是引用计数的方式,下面我们来写一个双向链表。 #include<iostream> #include<boost/shared_ptr.hpp> #include<boost/weak_ptr.hpp> using namespace std; struct Node { int _data; boost::shared_ptr<Node> _next; boost::shared_ptr<Node> _prev; }; int main() { boost::shared_ptr<Node> sp1(new Node); boost::shared_ptr<Node> sp2(new Node); sp1->_next = sp2; sp2->_prev = sp1; system("pause"); return 0; } 我们暂且将这两块空间称为Node1,和Node2,。我们从上述代码中可知,sp1,sp2,\_next,\_prev均为shared\_ptr类型的智能指针。sp1与sp2->prev都指向Node1,所以sp1的引用计数为2,同理sp1->\_next与sp2都指向Node2,所以sp2的引用计数也为2。这是前提,注意,问题来了。 ![Center][] 当我们想销毁这个链表或者说销毁一个结点的时候,我们需要将引用计数置为1,假如,我们要delete sp2这块空间,我们需要将sp2的引用计数置为1,就是说我们需要将sp1->\_next这个指针销毁掉。把sp2->\_next销毁, 就意味着先要把sp1销毁。 如果想把sp1销毁,就要把sp1的引用计数置为1,所以,我们就要把sp2->\_prev销毁,要想把sp2->\_prev销毁,就代表先要把sp2销毁。 这样一来,我们就陷入了一个无限的循环当中。 ![Center 1][] 这就是所谓的 shared\_ptr智能指针的循环引用问题。 我们如何用weak\_ptr来解决这个场景呢? 解决: #include<iostream> #include<boost/shared_ptr.hpp> #include<boost/weak_ptr.hpp> using namespace std; struct Node { int _data; boost::weak_ptr<Node> _next; boost::weak_ptr<Node> _prev; //boost::shared_ptr<Node> _next; //boost::shared_ptr<Node> _prev; }; int main() { boost::shared_ptr<Node> sp1(new Node); boost::shared_ptr<Node> sp2(new Node); sp1->_next = sp2; sp2->_prev = sp1; system("pause"); return 0; } 只需要把Node结点里面的指针定义为weak\_ptr类型就好,weak\_ptr的构造析构不会影响引用计数的大小,当我们采用这种方式时,sp1和sp2的引用计数始终为1,当我们想销毁时就可以随意操作啦! 当面试官问道你关于,shared \_ptr 的循环引用问题或者weak\_ptr时,你只需要将这个场景描述给他,就可以轻松的把这道题拿下了,祝你好运! [Center]: /images/20220717/4c1950d7a1ff4fbd804424b6da913515.png [Center 1]: /images/20220717/9bd20418f39f4ec7b4af38bee199d21d.png
相关 Java中的循环引用问题及解决方案 在Java中,循环引用是指两个或多个对象相互引用,形成了一个环形结构。这种情况通常发生在需要维护状态的引用场景,比如集合的添加和移除操作。 解决循环引用问题的方法主要有以下几 叁歲伎倆/ 2024年09月12日 01:15/ 0 赞/ 16 阅读
相关 详解Java中的弱引用概念及应用场景 在Java中,弱引用(Soft Reference)是一种特殊类型的引用,它不会增加目标对象的引用计数,当垃圾回收器进行内存清理时,软引用的对象才会被垃圾回收器回收。 应用场 港控/mmm°/ 2024年09月11日 08:12/ 0 赞/ 20 阅读
相关 nexttick的作用和应用场景 JS运行机制 > JS 执⾏是单线程的, 它是基于事件循环的。 事件循环⼤致分为以下⼏个步骤: > (1) 所有同步任务都在主线程上执⾏, 形成⼀个执⾏栈(execu 男娘i/ 2024年03月26日 13:35/ 0 赞/ 22 阅读
相关 什么是闭包?闭包的作用及应用场景 文章目录 一、什么是闭包 二、闭包的作用 三、使用闭包的注意点 四、思考题 五、应用场景 参考文章 一、什么是闭包 假设,把下 不念不忘少年蓝@/ 2022年12月29日 09:24/ 0 赞/ 181 阅读
相关 软引用、弱引用、虚引用-他们的特点及应用场景 为什么会有这4种引用 > `Java`中的引用的定义很传统:如果`reference`类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。 冷不防/ 2022年12月23日 09:48/ 0 赞/ 75 阅读
相关 怎么解决引用计数 GC 的循环引用问题? > 引用计数方式 GC 存在循环引用问题,导致无法辨别无用对象,而 GC ROOT 方式不存在循环引用的问题 引用计数和 GC ROOT 的实现机理很易理解,面试时大家都能流 分手后的思念是犯贱/ 2022年12月22日 09:53/ 0 赞/ 112 阅读
相关 weak_ptr的作用及应用场景——shared_ptr的循环引用问题 weak\_ptr 是为了辅助shared\_ptr而引入的一种智能指针,它存在的意义就是协助shared\_ptr更好的完成工作,我们可以把它比做成一个秘书或助理。 wea £神魔★判官ぃ/ 2022年07月18日 01:22/ 0 赞/ 177 阅读
相关 ActiveMQ的作用总结(应用场景及优势) 2018年06月08日 11:21:58 [青莲键仙][Link 1] 阅读数:4464 标签: [ActiveMQ][][作用][Link 2][优势][Link 3][应用 短命女/ 2022年04月03日 09:44/ 0 赞/ 196 阅读
相关 fastjson的循环引用和重复引用的问题排解 前言 项目中用json形式来存储一个集合对象,用fastjson发现多了一些东西:$ref,了解之后才发现是重复引用的问题,现在总结一下 重复引用问题代码 类定义 爱被打了一巴掌/ 2021年12月12日 07:47/ 0 赞/ 837 阅读
还没有评论,来说两句吧...