智能指针shared_ptr为什么会造成循环引用

本文详细解释了智能指针如何导致循环引用的问题,通过实例展示了两个A类型对象之间的智能指针互相引用,从而形成内存泄漏的情况。在程序结束时,由于堆区内的智能指针未被释放,导致对堆区资源的失控。解决循环引用的关键在于避免智能指针在堆区间的相互引用。理解这一概念对于防止内存泄漏至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

循环引用是什么

循环引用是因为智能指针对象所管理的A类型的对象中, 含有指向该A类型对象智能指针对象
可能会有点绕口, 请注意区分A类型的对象智能指针对象
因为A类型对象 甲中的智能指针对象指向了另外一个A类型对象 乙, 而另外一个A类型对象 乙中的只能指针对象也指向了A类型对象 甲, 之后再释放的时候, 发生了接下来的画面, 产生了循环引用, 而最终导致了资源浪费.

此时还未出现循环引用(图在下面)还未出现循环引用
第一个A对象甲中的智能指针已经指向了已, 开始指向已的计数器已经发生了变化(图在下面)在这里插入图片描述
循环引用已经出现, 互相指向了对方(图在下面)在这里插入图片描述

如果我们此时程序结束, 进行对象的释放, 不论是先释放甲, 还是先释放已, 都会因为循环引用来导致内存的泄漏

在开始释放前, 先要搞清楚, 指向甲或已的智能指针是在栈上的, 在最终调用结束后, 栈上的对象是自动释放的, 而甲或已内部的智能指针是在堆区的, 不会进行自动的释放

我们开始进行释放, 先释放指向甲的只能指针(这里需要注意的是, 甲是在堆区开辟的, 只有通过指针才能对其进行访问)(图在下面)

在这里插入图片描述
在这里插入图片描述

到了这一步, 因为仅仅是释放了栈区的只能指针, 而开辟在堆区的甲或已都没有释放自己的智能指针成员变量, 我们在外界失去了对堆区的控制, 而堆区内部却循环指向了对方

这便是智能指针循环引用, 造成循环引用的情况源于在堆区空间里的智能指针对象, 互相指向了另外的堆区空间, 最终导致失去对堆区的指向和控制, 没有释放内存.

如果你觉得我的文章有帮助到你, 请你帮我点个赞, 谢谢!!!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值