shared_ptr循环引用

什么是循环引用

shared_ptr虽然适合大多数的场景,但是使用时注意它的缺陷:可能存在循环引用。这里举例说明:

class B;
class D;
class B
{
public:
	~B()
	{}
	std::shared_ptr<D> D;
};
class D
{
public:
	~D()
	{}
	std::shared_ptr<B> B;
}:
void Testfunc()
{
	std::shared_ptr<B> b(new B);
	std::shared_ptr<D> d(new D);
	b->D=d;
	d->B=b;
}

当想要释放B对象时,D对象中保留了B对象的shared_ptr,所以向释放B对象先要释放D对象,但B对象中保留了D对象的shared_ptr,如此一来就陷入了死循环,无法释放资源。

怎么解决
  • 手动打破
    即在使用的最后对一个对象进行释放,循环就会打破。如:在函数的最后加上b->D.reset();

  • 配合weak_ptr使用
    weak_ptr是专用来帮助shared_ptr解决循环引用问题的。
    实现原理:RAII+operator*()、operator->()+解决浅拷贝。
    用引用计数的方式解决浅拷贝:标准库在shared_ptr、weak_ptr使用的背后维护一个引用计数的类。shared_ptr使用use整型变量、weak_ptr使用weak整型变量。

class B;
class D;
class B
{
public:
	~B()
	{}
	std::shared_ptr<D> D;
};
class D
{
public:
	~D()
	{}
	std::weak_ptr<B> B;
}:

相较于裸指针,weak_ptr提供了expired()接口,方便检测引用对象是否以释放,在使用weak_ptr后将其称为弱引用。

发布了39 篇原创文章 · 获赞 4 · 访问量 1120

猜你喜欢

转载自blog.csdn.net/qq_41403559/article/details/104320659