shared_ptr造成的循环引用&&解决方法和原理(弱引用&&强引用)

本文探讨了shared_ptr如何导致循环引用及内存泄漏,并提供了三种解决方案,重点介绍了弱引用——weak_ptr,解释了强引用和弱引用的区别,以及weak_ptr如何帮助解决shared_ptr的循环引用问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    用指针的方式解决shared_ptr造成的循环引用防止内存泄漏!


《***》循环引用就是由于智能指针shared_ptr造成的,下面就是shared_ptr的使用造成循环引用的图解:

《****》举个例子来说下shared_ptr造成的循环引用:

(选题背景双向链表)

<span style="font-size:18px;">#include<memory>
#include<iostream>
using namespace std;

struct Node
{
	shared_ptr<Node> _pre;
	shared_ptr<Node> _next;

	~Node()
	{
		cout << "~Node():" << this << endl;
	}
	int data;
};

void FunTest()
{
	shared_ptr<Node> Node1(new Node);
	shared_ptr<Node> Node2(new Node);
	Node1->_next = Node2;
	Node2->_pre = Node1;

	cout << "Node1.use_count:"<<Node1.use_count() << endl;
	cout << "Node2.use_count:"<< Node2.use_count() << endl;
}

int main()
{
	FunTest();
	system("pause");
	return 0;
}</span>


执行结果:

(说明:shared_ptr的使用使得一块空间有两个对象管理,即头个结点的_next域和下一个指针共同管理,或者又头一个指针和第二个结点的_ptr域共同管理所以其_pCount=2)

针对上面出现的由于引用计数和管理空间的对象的个数导致空间不能释放的结果就是循环引用。

针对循环引用我们有三种解决方案:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值