您的位置:首页 > 其它

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

2016-08-12 14:24 309 查看
  下面我说的智能指针都是基于引用计数的智能指针。     

   首先先明确一个结论:智能指针管理的对象,只有在引用计数为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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  智能指针