shared_ptr产生的循环引用问题
2017-11-11 21:14
316 查看
shared_ptr是个不错的东西,可以帮助我们智能的管理资源,但是使用不当,也是会引发一系列的问题,今天就来看下shared_ptr在管理双向链表结点的时候,所产生的循环引用问题。并且看下如何修改它。
现在我们来分析一下如何产生的这种情况
我们先看下shared-ptr的底层实现
在shared_ptr中我们使用的引用计数类为RefCount,下面我们来看下sp1和sp2的对象模型
以上就是在使用shared_ptr时,在连接sp1和sp2时引用计数变为2的原因。
当我们在使用weakd_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时,就不会出现以上问题了,下面我们来分析一下
循环引用计数的内容非常重要,我们要多总结!
相关文章推荐
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- shared_ptr循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- 浅谈shared_ptr及shared_ptr涉及到的循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- shared_ptr 循环引用问题
- C++11智能指针(五):shared_ptr的循环引用的问题及weak_ptr
- shared_ptr循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- C++智能指针(三):weak_ptr--解决shared_ptr循环引用问题
- 关于std::shared_ptr与std::enable_shared_from_this循环引用导致的问题
- weak_ptr的作用及应用场景——shared_ptr的循环引用问题
- shared_ptr循环引用问题
- shared_ptr相互引用问题
- boost的shared_ptr循环引用(1)
- shared_ptr:线程安全、循环引用
- shared_ptr:线程安全、循环引用
- Shared_ptr 相互引用问题
- 弱引用weak_ptr 解决shared_ptr的循环引用