shared_ptr产生的循环引用问题

来源:互联网 发布:cisco 9396端口配ip 编辑:程序博客网 时间:2024/06/05 14:42

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时,就不会出现以上问题了,下面我们来分析一下




循环引用计数的内容非常重要,我们要多总结!

阅读全文
0 0
原创粉丝点击