C++ shared_ptr循环引用问题/解决方法

C++ shared_ptr循环引用问题/解决方法

关于shared_ptr/weak_ptr

首先可以看一下这篇文章

C++的智能指针-unique_ptr,shared_ptr,weak_ptr

循环引用问题

shared_ptr存在循环引用问题:

考虑下面这样一个代码

image-20220224204433703

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Node
{
public:
int _data;
shared_ptr<Node> next;
shared_ptr<Node> prev;
};

int main()
{
fastIO

shared_ptr<Node>sp1 = make_shared<Node>();
shared_ptr<Node>sp2 = make_shared<Node>();
sp1->next = sp2;
sp2->prev = sp1;

return 0;
}

sp1sp2nextprev均为shared_ptr类型的智能指针 :

  • sp1sp2->prev都指向Node1,所以sp1的引用计数为2

  • sp1->nextsp2都指向Node2,所以sp2的引用计数也为2

当我们想销毁这个链表或者说销毁一个结点的时候,我们需要将引用计数置为1,假如,我们要delete sp2这块空间,我们需要将sp2的引用计数置为1,就是说我们需要将sp1->_next这个指针销毁掉。把sp2->_next销毁, 就意味着先要把sp1销毁。