循环引用是什么
循环引用是因为智能指针对象所管理的A类型的对象中, 含有指向该A类型对象的智能指针对象
可能会有点绕口, 请注意区分A类型的对象 和 智能指针对象
因为A类型对象 甲中的智能指针对象指向了另外一个A类型对象 乙, 而另外一个A类型对象 乙中的只能指针对象也指向了A类型对象 甲, 之后再释放的时候, 发生了接下来的画面, 产生了循环引用, 而最终导致了资源浪费.
此时还未出现循环引用(图在下面)
第一个A对象甲中的智能指针已经指向了已, 开始指向已的计数器已经发生了变化(图在下面)
循环引用已经出现, 互相指向了对方(图在下面)
如果我们此时程序结束, 进行对象的释放, 不论是先释放甲, 还是先释放已, 都会因为循环引用来导致内存的泄漏
在开始释放前, 先要搞清楚, 指向甲或已的智能指针是在栈上的, 在最终调用结束后, 栈上的对象是自动释放的, 而甲或已内部的智能指针是在堆区的, 不会进行自动的释放
我们开始进行释放, 先释放指向甲的只能指针(这里需要注意的是, 甲是在堆区开辟的, 只有通过指针才能对其进行访问)(图在下面)
到了这一步, 因为仅仅是释放了栈区的只能指针, 而开辟在堆区的甲或已都没有释放自己的智能指针成员变量, 我们在外界失去了对堆区的控制, 而堆区内部却循环指向了对方
这便是智能指针循环引用, 造成循环引用的情况源于在堆区空间里的智能指针对象, 互相指向了另外的堆区空间, 最终导致失去对堆区的指向和控制, 没有释放内存.
如果你觉得我的文章有帮助到你, 请你帮我点个赞, 谢谢!!!