转自:https://blog.csdn.net/weixin_43796685/article/details/104297360,讲的太明白了
1.图解
每一个smart_ptr都有两个数据成员,都是指针类型,一个是指向数据,另一个是引用计数。
上图举的例子是针对双向链表,每个节点Node都有一个next同样是smart_ptr去指向下一个节点,这样会导致下一个结点的引用计数变为1,导致最后无法析构节点,从而无法释放动态内存,导致内存泄漏。
解决的办法使用weak_ptr指向:
这样在指向next节点的时候,next的引用技术不会发生改变。
2.解决办法
1. 当只剩下最后一个引用的时候需要手动打破循环引用释放对象。
2. 当A的生存期超过B的生存期的时候,B改为使用一个普通指针指向A。
3. 使用弱引用的智能指针打破这种循环引用。
//1不太懂,不是引用都是2吗?怎么只剩下1个引用了?
//2的话,还需要判断具体情况,哪个对象生命周期短??