C++日记——Day31:weak_ptr概述、weak_ptr常用操作、尺寸

weak_ptr概述:

weak_ptr用来辅助shared_ptr进行工作;

强指针指的是shared_ptr,弱指针值得是weak_ptr;

weak_ptr:也是个类模板,智能指针。这个智能指针指向一个由shared_ptr管理的对象。但是weak_ptr这种指针不控制指针的生命周期,换句话来说,将weak_ptr绑定到shared_ptr上并不会改变shared_ptr的引用计数(更确切的说,weak_ptr的构造和析构不会增加或者减少所指向对象的引用计数)

当shared_ptr需要释放做指定对象的时候照常释放,不管是否有weak_ptr指向该对象。

能力弱(弱共享、若引用):控制不了所指向对象的生命周期;

这个若引用:大家理解成 监视shared_ptr(强引用)的生命周期用。是一种对shared_ptr的扩充

weak_ptr不是独立的智能指针,不能用来操作所指向的资源,所以它看起来像shared_ptr的扩展工具。

weak_ptr能够监视它所指向的对象是否存在。

 

weak_ptr创建

auto pi = make_shared<int>(100);
weak_ptr<int> piw(pi);  //piw 弱共享 pi,pi引用计数不改变,但是弱引用计数会改变(弱 
                        //引用计数会从0变成1)

weak_ptr<int> piw2;
piw2 = pi;   //也可以

只有强引用计数才能决定对象的生命周期,弱引用计数并不影响对象声明周期。

 

lock():检查weak_ptr所指向的对象是否存在,如果存在那么lock将返回一个指向该对象的shared_ptr(指向对象的强引用就会+1),如果指向对象不存在,lock会返回一个空的shared_ptr

auto pi3 = piw.lock(); //pi3 是一个shared_ptr
if (pi3 != nullptr){
    *pi3 = 12
}

 

weak_ptr常用操作

use_count():获取与该弱指针共享对象的shared_ptr的数量,或者说获得当前所观测的资源的强引用计数

auto pi = make_shared<int>(100);
auto pi2(pi);

weak_ptr<int> piw(pi);
int ic = piw.use_count(); //获取的是强引用的数量

 

expired():是否过期的意思。弱指针的use_count()为0(表示该弱指针所指向的对象已经不存在了),则返回true

这个函数用来观测 所观测的资源是否已经被释放了。

if (piw.expired())
{
    cout << "对象已经过期" << endl;
}

 

reset():将该弱引用指针设置为空,不影响该对象的强引用数量,但是指向该对象的弱引用数量会减少1。

auto p1 = make_shared<int>(12);
weak_ptr<int> pw;
pw = p1;
if( !pw.expired() )
{
    auto p2 = pw.lock(); //这里返回一个shared_ptr,此时强引用的计数为2
    if (p2 != nullptr)
    {
        int test;
        test = 1;
    }
    //离开这个范围,强引用的计数会变成1
}
weak_ptr<int> pw;
{
    auto p1 = make_shared<int>(12);
    pw = p1;
}

//此时,pw会无效,p1离开了作用域会被释放

if( !pw.expired() )
{
    auto p2 = pw.lock(); //这里返回一个shared_ptr,此时强引用的计数为2
    if (p2 != nullptr)
    {
        int test;
        test = 1;
    }
    //离开这个范围,强引用的计数会变成1
}

 

尺寸问题:

weak_ptr<int> pw;

weak_ptr与shared_ptr的尺寸一样大,是裸指针的两倍。

内部有两个裸指针

第一个裸指针指向的是这个智能指针所指向的对象;

第二个所指针指向一个数据结构(控制块),这个控制块里有:

1、引用计数(强引用计数、弱引用计数)

2、其他数据(弱引用删除器等)

             

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值