解决shared_ptr的循环引用
创作时间:
作者:
@小白创作中心
解决shared_ptr的循环引用
引用
CSDN
1.
https://blog.csdn.net/guaiguaiyalj/article/details/143248681
在实现智能指针shared_ptr
中有一个问题就是循环引用的问题,对于循环引用看下面的图来理解:
node1
和node2
两个智能指针对象指向两个节点,引用计数变成1,我们不需要手动delete
。node1
的_next
指向node2
,node2
的_prev
指向node1
,引用计数变成2(因为我们定义的结构中_next
和_prev
也是shared_ptr
的智能指针对象)。node1
和node2
析构,引用计数减1,但是_next
还指向下一个节点。_prev
还指向上 一个节点。- 也就是说
_next
析构了,node2
的引用计数变为0,就释放了;同理_prev
析构了,node1
就释放了。 - 但是
_next
属于node1
的成员,node1
释放了,_next
才会析构,而node1
由_prev
管理,_prev
属于node2
成员,所以这就叫循环引用,谁也不会释放。
再换个角度理解:
假如这里只有一个指向:node1->_next = node2
;这样node1
的计数为1,node2
的计数为2,node1
和node2
析构就会让node1
的计数见减为0,node2
减为1,然后node1
计数为0释放,同时也会让node1
的成员_next
析构,_next
的析构就会导致node2
的计数减为0,这样node2
也会释放,就不会有循环引用的问题。
我们这次要解决循环引用,就要把结构体中的_next
和_prev
不要计数就可以解决,那样node1
和node2
析构时资源也就释放了。解决方案:在引用计数的场景下,把节点中的_prev
和_next
改成weak_ptr
就可以了。原理就是,node1->_next = node2
和node2->_prev = node1
时,weak_ptr
的_next
和 _prev
不会增加node1
和node2
的引用计数。
template<class T>
class weak_ptr
{
public:
weak_ptr()
:_ptr(nullptr)
{}
weak_ptr(const shared_ptr<T>& sp)
:_ptr(sp.get())
{}
weak_ptr<T>& operator=(const shared_ptr<T>& sp)
{
_ptr = sp.get();
return *this;
}
// 像指针一样
T& operator*(){return *_ptr;}
T* operator->(){return _ptr;}
private:
T* _ptr;
};
这里拷贝构造和赋值都是对shared_ptr
对象,也就是说只需要拷贝构造和赋值shared_ptr
对象的_ptr
就可以了。因为这是不同的类,_ptr
是shared_ptr
中的私有成员,不可访问,有两种方式可以实现:1、友元类;2、在shared_ptr
中写一个公有的成员函数get
来获取_ptr
。
热门推荐
如何正确爱一个婴儿:构建坚实的安全感
湖南各地开展“家庭家教家风”主题活动,分享家风故事引领文明风尚
怎么认定非因本人意愿中断就业
哪些企业在参与中国量子计算机的研发?
VR反诈安全体验馆:创新的反诈宣传教育方式
预防职业病,这些知识要了解
私厨行业深度分析:机遇与挑战并存
休想晒黑我!三甲皮肤科主任整理的超全防晒指南!速速收藏
GTA6的最低配置和推荐配置是什么?如何选择适合的配置以流畅运行游戏
如何像专业人士一样拍出高质量的建筑照
垂体瘤治疗方法全解析:药物、手术、放疗各有优劣
为什么无畏契约被称为“瓦”?揭秘游戏昵称背后的故事
【商品摄影教学】拍商品照不用花大钱!教你用简易小物打造5种专业效果
野猪泛滥已危害全国26省份 万一遇野猪怎么办?
讲师个人所得税的计算公式
ROS中的包(Packages)详解
前端如何保证用户的安全
甲流症状有哪些怎么治疗?全面解析与科学应对
如何融入团队创业:建立关系、承担责任与提升技能
完美饺子皮制作技巧:从和面到包饺子的详细步骤解析
债务处理指南:协商还款、合法讨债与负债证明
从杂乱到有序:实用整理技巧全攻略
招投标常用的评标方法及适用范围
灭火器压力表颜色含义及使用注意事项
最新!事关宁夏各地供暖:往年“老大难” 今冬会“复发”吗?
巴基斯坦分析,歼10CE战机,短板明显,到底有多大的问题?
压力管理的5种实用方法,助你轻松应对生活挑战
如何查询一家公司是否合法?两种官方渠道任你选
电脑蓝屏了怎么恢复正常?电脑蓝屏怎么办?一分钟教你修好
九江银行高管变动有意思:原行长潘明任职9年却没升任 反而降职!