智能指针(五weak_ptr)

弱智能指针与强智能指针的区别:
weak_ptr也是一个引用计数型的智能指针,但是它不会增加对象的引用计数,即弱引用,而shared_ptr是一个强引用,会增加对象的引用计数,只要有一个指向独享的shared_ptr存在,该对象就不会析构,直到最后一个shared_ptr析构时才会被销毁。

弱智能指针解决了什么问题:
对于shared_ptr来说,它在设计交叉使用时会遇到一个很棘手的问题,如下:

class B;
class A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A" << endl;
	}
	shared_ptr<B> _s_b;
};
class B
{
public:
	B()
	{
		cout << "B()" << endl;
	}
	~B()
	{
		cout << "~B()" << endl;
	}
	shared_ptr<A> _s_a;
};
int main()
{
A* pa = new A();
B* pb = new B();
shared_ptr<A>s_pa(pa);
shared_ptr<B>s_pb(pb);
pa->_s_b = s_pb;
pb->_s_a = s_pa;
}

运行结果:
在这里插入图片描述
并没有析构;
在这里插入图片描述
由于弱引用不会增加引用计数,这个时候我们只需要把其中的一方设置为弱引用就可解决这个问题
在这里插入图片描述
运行结果:
在这里插入图片描述

弱指针还可解决指针空悬问题:
在这里插入图片描述
有两个指针p1和p2,它们都指向堆上的同一个对象Object,但是p1和p2处于不同的线程中,假设某一时刻,线程A通过p1指针将Object销毁,那么p2就成了空悬指针。
该如何解决这个问题呢?
weak_ptr不控制对象的生命周期,但是它知到对象是否还活着。如果对象还活着,那么他可以提升为有效的shared_ptr(提升操作通过lock()函数获取所管理对象的强引用指针);如果对象已经被销毁了,提升会失败,返回一个空的shared_ptr.
弱智能指针特点:

  • 弱智能指针不能直接使用,必须、必须通过强智能指针来提升,不可通过普通指针来提升
  • 弱智能指针可隐式构造
  • 弱智能指针不增加引用计数
  • 使用提升弱智能指针的强智能指针必须是存在的,不能是已经销毁的
    例:
int main()
{
	shared_ptr<int>s_pa(new int(99));
	weak_ptr<int>w_s(new int(99));//错
	weak_ptr<int>w_p(s_pa);//显示构造
	weak_ptr<int>w_p = s_pa;//隐式构造

    shared_ptr<int>s_pb(w_p.lock())//提升弱智能指针
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值