weak_ptr基本用法以及怎么解决循环引用

weak_ptr基本用法

循环引用问题

虽然shared_ptr是用来避免内存泄漏,可以自动释放内存。但是shared_ptr在使用中可能存在循环引用,使引用计数失效,从而导致内存泄漏的情况。如下代码所示:

#include <iostream>
#include <memory>
using namespace std;
class A {
   
public:
	std::shared_ptr<B> bptr;
	~A() {
   
		cout << "A is deleted" << endl;
	}
};
class B {
   
public:
	std::shared_ptr<A> aptr;
	~B() {
   
		cout << "B is deleted" << endl;
	}
};
int main()
{
   
	{
   //设定一个作用域
		std::shared_ptr<A> ap(new A);
		std::shared_ptr<B> bp(new B);
		ap->bptr = bp;
		bp->aptr = ap;
	}
	cout<< "main leave" << endl; // 循环引用导致ap bp退出了作用域都没有析构
	return 0;
}

循环引用导致ap和bp的引用计数都为2,在离开作用域之后,ap和bp的引用计数只减为1,而没有减为0,导致两个指针都不会被析构,产生内存泄漏。

weak_ptr定义

weak_ptr叫弱引用指针。是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象。weak_ptr 设计的目的是为了协助shared_ptr而引入的一种智能指针,它可以解决shared_ptr循环引用的问题。weak_ptr只可以从一个shared_ptr或另一个 weak_ptr 对象来构造, 它的构造和析构不会引起引用记数的增加或减少。

weak_ptr解决循环引用

shared_ptr智能指针的循环引用导致的内存泄漏问题,可以通过weak_ptr解决。只需要将A或B的任意一个成员变量改为weak_ptr:

#
  • 15
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值