shared_ptr产生的循环引用问题

shared_ptr是个不错的东西,可以帮助我们智能的管理资源,但是使用不当,也是会引发一系列的问题,今天就来看下shared_ptr在管理双向链表结点的时候,所产生的循环引用问题。并且看下如何修改它。

 

typedef int Datatype;
 struct ListNode
{
	shared_ptr<ListNode> _Ppre;
	shared_ptr<ListNode> _Pnext;
	Datatype data;

	~ListNode()
	{
		cout << "~ListNode()" << endl;
	}
};

void test()
{
	//创建shared_ptr的两个对象,这两个对象管理的空间是双向链表的结点
	shared_ptr<ListNode> sp1(new ListNode());
	shared_ptr<ListNode> sp2(new ListNode());

	//打印两个对象的引用计数
	cout << "sp1->Count:" << sp1.use_count()<<endl;
	cout << "sp2->count:" << sp2.use_count()<<endl;

	//将sp1的pnext域与sp2连接
	sp1->_Pnext = sp2;
	//将sp2的Ppre域与sp1连接
	sp2->_Ppre = sp1;

	cout << "sp1->Count:" << sp1.use_count() << endl;
	cout << "sp2->count:" << sp2.use_count() << endl;
}

当我们创建shared_ptr的两个对象sp1,sp2时,sp1和sp2各管理一块具有双向链表结点的空间,我们分别打印未连接之前的引用计数如图1,此时sp1和sp2各管理一块空间,引用计数各为1,并且调用了析构函数。在将sp1和sp2连接之后,引用计数各变为2,此时在调用析构函数之后,不满足释放空间的条件,没有析构函数函数体的输出,这时就造成内存泄露。

 

    

现在我们来分析一下如何产生的这种情况

我们先看下shared-ptr的底层实现

 

在shared_ptr中我们使用的引用计数类为RefCount,下面我们来看下sp1和sp2的对象模型

以上就是在使用shared_ptr时,在连接sp1和sp2时引用计数变为2的原因。

当我们在使用weakd_ptr时,就不会出现以上问题了,下面我们来分析一下

 

循环引用计数的内容非常重要,我们要多总结!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值