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

本是古典 何须时尚 2022-09-25 04:18 248阅读 0赞

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

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

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

有两种情况发生循环引用

情况1:自己包含自己

class Obj {

  1. public:
  2. void SetItself(share\_ptr<Obj> &o) \{
  3. itself\_ = o;
  4. \}
  5. private:
  6. share\_ptr<Obj> itself\_;

};

int main() {

  1. share\_ptr<Obj> o(new Obj());
  2. o->SetItself(o);

}

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

o使引用计数增了1

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

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

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

class A {

public:

  1. share\_ptr<B> b\_;

};

class B {

public:

  1. share\_ptr<A> a\_;

};

int main() {

share_ptr a(new A());

share_ptr b(new B());

a.b_ = b;

b.a_ = a;

}

现在连个对象A,B。

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

总结:

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

发表评论

表情:
评论列表 (有 0 条评论,248人围观)

还没有评论,来说两句吧...

相关阅读

    相关 shared_ptr基于引用计数智能指针实现

    智能指针是什么 简单来说,智能指针是一个类,它对普通指针进行封装,使智能指针类对象具有普通指针类型一样的操作。具体而言,复制对象时,副本和原对象都指向同一存储区域,如果通