(笔记)为何boost中boost::shared_ptr 循环引用会导致引用计数机制失效
来源:互联网 发布:中国输电网络先进吗 编辑:程序博客网 时间:2024/05/21 09:38
public:
node(){
cout << "构造node" << endl;
}
~node(){
cout << "delete node" << endl;
}
boost::shared_ptr<node> next;
};
int _tmain(int argc, _TCHAR* argv[])
{
{
auto p1 = boost::make_shared<node>();
auto p2 = boost::make_shared<node>();
p1->next = p2;
p2->next = p1;
}
}
分析:
智能指针p1,p2是指上是对象,在这里,是在 栈 中分配内存的,退出作用域的话 就会被 析构。
下面将 p1中 px 指向的node对象 称作 node1,将 p2中 px 指向的node对象 称作 node2
p1->next=p2。这句代码将 堆中的 node1对象的next 复制为p2 ,此时 next(next=p2) 是在堆中的
同样,p2->next = p1;此时 next(next=p1) 是在堆中的
这样使得:p1.user_count()==2 , p1.user_count()==2
退出作用域 智能指针 p1、p2(实质上是对象)被析构,那么就会调用shared_count的析构函数,但是此时两者引用计数都为2,所以并不会执行
dispose(); 从而导致node1,node2一直在堆中。
~shared_count() // nothrow
{
if( pi_ != 0 ) pi_->release();
#if defined(BOOST_SP_ENABLE_DEBUG_HOOKS)
id_ = 0;
#endif
}
其中 release;
void release() // nothrow
{
if( atomic_decrement( &use_count_ ) == 1 ) //atomic_decrement 返回递减之前的值
{
dispose();
weak_release();
}
}
【理解的关键点:】在堆中的 两个shared_ptr<node> 没有被释放,导致 atomic_decrement( &use_count_ ) == 1 为 false
- (笔记)为何boost中boost::shared_ptr 循环引用会导致引用计数机制失效
- boost的shared_ptr循环引用
- boost的shared_ptr循环引用
- boost的shared_ptr循环引用
- boost的shared_ptr循环引用(1)
- 理解 boost::shared_ptr 中的引用计数是如何工作的
- 在smart_ptr中处理引用计数时使用swap概念(boost::shared_ptr.hpp)
- 理解 boost::shared_ptr 中所谓的循环引用是如何形成的
- boost::shared_ptr:传值还是传引用?
- boost shared_ptr计数分析
- boost库在工作(8)引用计数的智能指针shared_ptr之一
- boost库在工作(9)引用计数的智能指针shared_ptr之二
- boost库在工作(8)引用计数的智能指针shared_ptr之一
- boost库在工作(9)引用计数的智能指针shared_ptr之二
- CCCallFuncN误用导致引用计数循环引用
- 关于boost 库 shared_ptr 智能指针的循环引用【2013.10.22】
- boost之shared_ptr,weak_ptr计数
- boost---shared_ptr笔记
- 表格存储如何实现跨区域的容灾
- webots自学笔记(一)软件界面和简单模型仿真
- GridView排序
- osg动态修改坐标
- h5 选择结构 调试 switch
- (笔记)为何boost中boost::shared_ptr 循环引用会导致引用计数机制失效
- Hadoop实战(9)_Hive进阶及UDF开发
- value.toFixed is not a function
- Chrome浏览器快捷键
- 变量加载顺序
- [Unity][C#][File]File无法新建文件UnauthorizedAccessException,File.Create is denied的解决办法
- Android进阶(二)--序列化Serializable和Parcelabel使用与区别
- spring-cloud【eureka】
- js 读取excel