(笔记)为何boost中boost::shared_ptr 循环引用会导致引用计数机制失效

来源:互联网 发布:中国输电网络先进吗 编辑:程序博客网 时间:2024/05/21 09:38
class node{
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








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