为什么会造成循环引用问题:
首先来看一段代码:
在该带码的运行结果中可以看到引用计数都是2,在分别调用析构函数之后它们 的引用计数都变成1,但是只有当引用计数都变成0的时候才会真正销毁资源,因此在此代码中发生了内存泄漏。
为什么引用计数会变成2:
首先在声明sp1和sp2时它们的引用计数都变成1,然后分别给其中管理的指针进行赋值的时候,引用计数又会进行加1,这样在最后在析构资源就会造成了循环引用,这也就是循环引用问题,也就是shared_ptr中的缺陷。
接下来描述如何解决这个问题:
这个问题借助weak_ptr来进行解决,weak_ptr配合shared_ptr使用来解决循环引用问题(注:weak_ptr不能独立管理资源)
接下来演示代码如何解决这个问题:
从图中可以看到,引用计数都变成1了,这样就在析构函数中可以完整的销毁资源了;接下来解释为什么么weak_ptr可以解决循环引用的问题 :