基于引用计数的智能指针为什么会发生循环引用
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
首先先明确一个结论:智能指针管理的对象,只有在引用计数为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
相关文章推荐
- share_ptr的几个注意点
- 智能指针与弱引用详解
- C++ 智能指针深入解析
- C++中的auto_ptr智能指针的作用及使用方法详解
- C++中auto_ptr智能指针的用法详解
- C++智能指针读书笔记
- How to get a boost::shared_ptr from this
- C++ 智能指针详解
- C++智能指针(auto_ptr)详解
- boost——智能指针札记
- 智能指针使用摘要
- boost 智能指针
- 智能指针
- [osg]源码分析:OSG中的智能指针osg::ref_ptr
- 智能指针
- C++ auto_ptr智能指针的用法
- Cocos2d内存管理分析
- C++ 智能指针详解
- C++中的智能指针(smart pointer)
- 56 RAII实现智能指针