作者:神秘的绝代双角 | 来源:互联网 | 2023-05-17 12:18
下面我说的智能指针都是基于引用计数的智能指针。首先先明确一个结论:智能指针管理的对象,只有在引用计数为0的时候才会释放。循环引用发生的情况就是违反了上面所说的结论:引用计数
下面我说的智能指针都是基于引用计数的智能指针。
首先先明确一个结论:智能指针管理的对象,只有在引用计数为0的时候才会释放。
循环引用发生的情况就是违反了上面所说的结论:引用计数不能递减到0,以至于对象不能释放。
有两种情况发生循环引用
情况1:自己包含自己
class Obj {
public:
void SetItself(share_ptr &o) {
itself_ = o;
}
private:
share_ptr itself_;
};
int main() {
share_ptr 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_;
};
class B {
public:
share_ptr 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