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,所以向释放D对象先要释放B对象,但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后将其称为弱引用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值