weak_ptr的常用操作

举报
无敌清风蓝 发表于 2023/11/22 20:03:54 2023/11/22
【摘要】 1.引言首先明确下他是干啥的,他就是个旁观者,旁观啥呢,旁观shared_ptr,对它就是在旁边看着啥也做不了所以它是弱,shared_ptr则是强怎么创建它呢auto pi = make_shared<int>(100);weak_ptr<int> piw(pi);//piw弱共享pi,pi引用计数(强引用计数)不改变,弱引用计数会从0变为1,pi和piw两者指向相同位置shared_p...

1.引言

首先明确下他是干啥的,他就是个旁观者,旁观啥呢,旁观shared_ptr,对它就是在旁边看着啥也做不了

所以它是弱,shared_ptr则是强

怎么创建它呢

auto pi = make_shared<int>(100);
weak_ptr<int> piw(pi);//piw弱共享pi,pi引用计数(强引用计数)不改变,弱引用计数会从0变为1,pi和piw两者指向相同位置

shared_ptr指向的对象,代表的引用统统都是强引用,而weak_ptr则统统都是弱引用

//上面第二行写法等价于下面的
weak_ptr<int> piw;
piw = pi; //pi这是一个shared_ptr,赋值给一个weak_ptr,pi和piw两者指向相同位置
weak_ptr<int> piw2;
piw2 = piw;//把weak_ptr赋值给另外一个weak_ptr,现在pi是一个强引用两个弱引用

因为它是旁观者,所以就算shared_ptr引用计数为0了也无所谓,所以它指向的对象很有可能不存在,所以它不能直接访问对象

必须用一个叫lock的成员函数来检查它指向的对象是否存在,存在的话返回一个指向共享对象的shared_ptr,因为它是旁观的嘛,所以最后返回的还得是个实权人物,当然原来shared_ptr引用计数会+1,如果不存在,就返回一个空的shared_ptr

接着上面继续写代码

auto pi2 = piw.lock(); //强引用(shared_ptr)会加1,现在pi是两个强引用两个弱引用
if(pi2 != nullptr) //成立,写成if(pi2)也行
{
    cout << "所指向的对象存在" << endl;
}    

2.weak_ptr常用操作

—1.use_count成员函数

获取它老大(shared_ptr)的个数

auto pi = make_shared<int>(100);
auto pi2(pi);
weak_ptr<int> piw(pi);
int isc = piw.use_count(); //与整个piw共享对象的shared_ptr数量,  有两个

—2.expired成员函数

看老大是不是都走了,也就是看资源是不是都释放了,因为老大都不在了,那就说明这没啥价值了,正经点说,就是判断use_count是不是0(弱指针所指向的对象不存在),是的话返回true

继续上面的代码

pi.reset();
pi2.reset();
if(piw.expired()) //成立
{
    cout << "piw已过期" << endl;
}

—3.reset成员函数

把当前这个小弟让他走(把现在这个weak_ptr指针设置为空),比如原来是两个weak_ptr引用,现在变成一个,不影响老大shared_ptr的数量

auto pi = make_shared<int>(100);
weak_ptr<int> piw(pi);
piw.reset(); //pi是一个强引用,没有弱引用了

—4.lock成员函数

造出来一个新老大,如果有老大在,则造出来一个新老大;没有老大在了就返回一个空老大(没有灵魂)

auto p1 = make_shared<int>(42);
weak_ptr<int>pw;
pw = p1; //老大带小弟
if(!pw.expired()) //说明有老大在
{
    auto p2 = pw.lock(); //造一个新老大,返回的p2是一个shared_ptr,现在p1是2个强引用,1个弱引用
    if(p2 != nullptr)
    {
        cout << "所指向的对象存在" << endl;
    }
    //离开这个范围,p1强引用计数恢复为1,弱引用保持为1
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。