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
- shared_ptr产生的循环引用问题
- shared_ptr循环引用问题
- shared_ptr循环引用问题
- shared_ptr 循环引用问题
- shared_ptr循环引用问题
- 浅谈shared_ptr及shared_ptr涉及到的循环引用问题
- boost的shared_ptr循环引用
- boost的shared_ptr循环引用
- boost的shared_ptr循环引用
- 浅谈shared_ptr与循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- std::shared_ptr 和 std::weak_ptr的用法以及引用计数的循环引用问题
- boost的shared_ptr循环引用(1)
- weak_ptr的作用及应用场景——shared_ptr的循环引用问题
- 关于std::shared_ptr与std::enable_shared_from_this循环引用导致的问题
- 弱引用weak_ptr 解决shared_ptr的循环引用
- Web前端开发中会遇到的浏览器兼容问题(消灭bug②)
- C++实现Linux下遍历指定目录下的文件
- python 文件操作
- Synchronized(对象锁)和Static Synchronized(类锁)的区别
- android monkey_log分析
- shared_ptr产生的循环引用问题
- STM8L低功耗设置,深坑。。。
- 模拟下拉框,IPAd,iOS不兼容
- Android探索之旅(第二十二篇)纳尼?后台人员没有接口文档,那是不可能的
- USB入门系列总结
- Map拷贝 关于对象深拷贝 浅拷贝的问题
- redis学习(五)——Set数据类型
- 软考之计算机硬件
- 正则表达式30分钟入门教程