您的位置:首页 > 其它

shared_ptr产生的循环引用问题

2017-11-11 21:14 316 查看
shared_ptr是个不错的东西,可以帮助我们智能的管理资源,但是使用不当,也是会引发一系列的问题,今天就来看下shared_ptr在管理双向链表结点的时候,所产生的循环引用问题。并且看下如何修改它。

typedef int Datatype;
struct ListNode
{
shared_ptr<ListNode> _Ppre;
shared_ptr<ListNode> _Pnext;
Datatype data;

~ListNode()
{
cout << "~ListNode()" << endl;
}
};

void test()
{
//创建shared_ptr的两个对象,这两个对象管理的空间是双向链表的结点
shared_ptr<ListNode> sp1(new ListNode());
shared_ptr<ListNode> sp2(new ListNode());

//打印两个对象的引用计数
cout << "sp1->Count:" << sp1.use_count()<<endl;
cout << "sp2->count:" << sp2.use_count()<<endl;

//将sp1的pnext域与sp2连接
sp1->_Pnext = sp2;
//将sp2的Ppre域与sp1连接
sp2->_Ppre = sp1;

cout << "sp1->Count:" << sp1.use_count() << endl;
cout << "sp2->count:" << sp2.use_count() << endl;
}
当我们创建shared_ptr的两个对象sp1,sp2时,sp1和sp2各管理一块具有双向链表结点的空间,我们分别打印未连接之前的引用计数如图1,此时sp1和sp2各管理一块空间,引用计数各为1,并且调用了析构函数。在将sp1和sp2连接之后,引用计数各变为2,此时在调用析构函数之后,不满足释放空间的条件,没有析构函数函数体的输出,这时就造成内存泄露。


    


现在我们来分析一下如何产生的这种情况

我们先看下shared-ptr的底层实现



在shared_ptr中我们使用的引用计数类为RefCount,下面我们来看下sp1和sp2的对象模型



以上就是在使用shared_ptr时,在连接sp1和sp2时引用计数变为2的原因。

当我们在使用weakd_ptr时,就不会出现以上问题了,下面我们来分析一下





循环引用计数的内容非常重要,我们要多总结!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: