【博客17】利用weak_ptr解决 “循环引用“

内容: c++11后,我们有了新的智能指针可以使用,我们可以抛弃auto,而使用新的智能指针,其中shared_ptr指针在正常使用是没有问题的,但是如果shared_ptr出现互相引用的时候,那么就会出现循环引用,从而导致资源没有办法正确释放。

测试代码:
在这里插入图片描述
测试结果:
在这里插入图片描述
分析:当pa,pb构造时,他们的引用计数为1,接下来由于循环引用,导致两者的引用计数为2,离开作用域后,引用计数都为1,因此不释放资源。这就是循环引用导致的后果。

解决方法: 利用weak_ptr就可以解决循环引用的问题,因为weak_ptr是弱引用型指针,是用来监视shared_ptr的,不会使引用计数增加,但是它不管理shared_ptr内部的指针,也就是数据指针,它是用来监视shared_ptr生命周期的,通过它的构造不增加引用计数,析构不减少引用计数这一点,从而解决了循环引用的问题。

测试代码:
在这里插入图片描述
结果:
在这里插入图片描述
结果分析:首先创建的时候双方的引用计数为1,接着pb赋值给pa->bptr这个会使pb的引用计数加1,此时为2,pa仍为1,接着pa赋值给pb->aptr这个由于是weak_ptr指针的构造,不会使它的引用计数加1,pa的引用计数为1,pb的引用计数为2,离开作用域后,pa计数为0,析构,pb计数为2-1=1,不析构,但是由于pa析构,pa中的bptr会析构,那么引用计数减1,这时候pb引用计数为1-1=0,也析构。实现资源的完整释放。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值