弱用指针的方式解决shared_ptr造成的循环引用防止内存泄漏!
《***》循环引用就是由于智能指针shared_ptr造成的,下面就是shared_ptr的使用造成循环引用的图解:
《****》举个例子来说下shared_ptr造成的循环引用:
(选题背景双向链表)
<span style="font-size:18px;">#include<memory>
#include<iostream>
using namespace std;
struct Node
{
shared_ptr<Node> _pre;
shared_ptr<Node> _next;
~Node()
{
cout << "~Node():" << this << endl;
}
int data;
};
void FunTest()
{
shared_ptr<Node> Node1(new Node);
shared_ptr<Node> Node2(new Node);
Node1->_next = Node2;
Node2->_pre = Node1;
cout << "Node1.use_count:"<<Node1.use_count() << endl;
cout << "Node2.use_count:"<< Node2.use_count() << endl;
}
int main()
{
FunTest();
system("pause");
return 0;
}</span>
执行结果:
(说明:shared_ptr的使用使得一块空间有两个对象管理,即头个结点的_next域和下一个指针共同管理,或者又头一个指针和第二个结点的_ptr域共同管理所以其_pCount=2)
针对上面出现的由于引用计数和管理空间的对象的个数导致空间不能释放的结果就是循环引用。
针对循环引用我们有三种解决方案: