基于引用计数的智能指针为什么会发生循环引用

  下面我说的智能指针都是基于引用计数的智能指针。     

   首先先明确一个结论:智能指针管理的对象,只有在引用计数为0的时候才会释放。


   循环引用发生的情况就是违反了上面所说的结论:引用计数不能递减到0,以至于对象不能释放。


   有两种情况发生循环引用


   情况1:自己包含自己


  class Obj {

    public:

       void SetItself(share_ptr<Obj> &o) {

          itself_ = o;

       }

    private:

      share_ptr<Obj> itself_;

  };

 int main() {

     share_ptr<Obj> o(new Obj());

     o->SetItself(o);

 }

o->SetItself(o);  这句执行完了以后引用计数是2

o使引用计数增了1

成员变量itself_使引用计数增加了1

现在有个矛盾的地方:什么时候itself_会使引用计数减去1,itself_释放的时候,那么什么时候itself_释放,对象obj被释放的时候,但obj的释放又要引用计数为0。


情况2:两个对象,我中又你,你中有我


class A {

  public:

    share_ptr<B> b_;

};

class B {

  public:

    share_ptr<A> a_;

};


int main() {

  share_ptr<A> a(new A());

  share_ptr<B> b(new B());

  a.b_ = b;

  b.a_ = a;

}

现在连个对象A,B。

管理他们的智能指针的引用计数都是2,但是由于他们本身的成员变量是个智能智能,这个智能指针使得引用计数不能递减为0;




总结:


发生循环引用的情况:引用计数要递减为0的前提是对象被释放,而对象被释放的前提是引用计数递减为0

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值