智能指针三剑客:weak_ptr

目录

weak_ptr概述

 weak_ptr对象

weak_ptr简单操作


weak_ptr概述

weak_ptr并不是独立的智能指针,weak_ptr主要被用来辅助share_ptr工作。由于weak_ptr的引用计数并不与指向对象的生命周期相关联,weak_ptr可以安全的访问一个由shared_ptr所管理的对象并不改变指向对象的内容。所以使用weak_ptr访问对象不需要担心意外延长其生命周期。除此之外,weak_ptr一般还被用于解决shared_ptr产生的循环问题。

 weak_ptr对象

weak_ptr的生存依赖于shared_ptr,我们可以使用shared_ptr对象初始化weak_ptr对象,也可以用weak_ptr对象给weak_ptr对象初始化。

shared_ptr<int> ps=weak_ptr<int>(666);
weak_ptr<int> pw(ps);
weak_ptr<int> pw2=pw;

weak_ptr 的创建会引起弱引用计数的增加。与shared_ptr指向产生的强引用计数不同,弱引用计数的增加并不会影响管理对象的生命周期。在调试时,shared_ptr对象和weak_ptr对象都可以用来观察强引用和弱引用的计数。

weak_ptr对象并不管理指向内存的生命周期会造成weak_ptr对象有可能指向一片已经被释放了的内存空间。因此weak_ptr对象并不能直接的访问指向的对象,而是通过使用lock()函数间接访问以确保其安全性。lock的功能是检查weak_ptr指向的对象是否存在,若存在返回指向该对象的shared_ptr指针。若对象已经被释放,返回空的shared_ptr对象。

shared_ptr<int> ps=make_shared<int>(666);
weak_ptr<int> pw(ps);
shared_ptr<int> ps2=pw.lock();
if(pw2==nullptr)
{
    cout<<"delete over"<<endl;
}
else
{
    cout<<"strong live"<<endl;
}

weak_ptr简单操作

use_count():返回与该weak_ptr对象指向相同的强指针数量,也就是shared_ptr的引用计数。

shared_ptr<int> ps(new int(666));
auto ps2(ps);
weak_ptr<int> pw(ps);
cout<<pw.use_count()<<endl;//2

expired():检查指向对象是否过期,如果指向对象内存已经被释放了,返回true,否则返回false。

shared_ptr<int> ps(new int(999));
weak_ptr<int> pw(ps);
ps.reset();
if(pw.expired())
{
    cout<<"指向对象已经过期"<<endl;
}

reset():weak_ptr对象也有reset功能。将该weak_ptr对象置空,强引用计数不变,弱引用计数减一。

shared_ptr<int> ps(new int(666));
weak_ptr<int> pw(ps);
pw.reset();

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼多不菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值