(资料图)
weak_ptr 的使用
\(\quad\)关于为什么使用 weak_ptr,以及他的使用场景,我们在这篇文章中已经进行了介绍。而对于其具体的使用方法,比如说如何通过 weak_ptr访问内存中的数据等操作还未提及,这里做个简单赘述。
\(\quad\)有一句话说的很好: weak_ptr就像观测者那样观测资源的使用情况。
- 首先,
weak_ptr是配合shared_ptr的使用,weak_ptr可以用shared_ptr来赋值,但当它引用shared_ptr时并不会引起它的计数。 - 另外,
weak_ptr并没有重载解引用等操作符,也不单独使用(不能单独使用的原因是,weak_ptr没有重载解引用*、->运算符,也就是说它只能访问但不能修改)。 - 使用
expired()检查weak_ptr的引用情况(expired()==true时表示资源已被释放),使用lock()获取一个shared_ptr的对象。
和 shared_ptr、unique_ptr相比,weak_ptr 模板类提供的成员方法不多,以下是常用的成员方法及各自的功能:
- operator=():重载 = 赋值运算符,是的
weak_ptr指针可以直接被weak_ptr或者shared_ptr类型指针赋值。 - swap(x):其中 x 表示一个同类型的
weak_ptr类型指针,该函数可以互换 2 个同类型weak_ptr指针的内容。 - reset():将当前
weak_ptr指针置为空指针。 - use_count():查看指向和当前
weak_ptr指针相同的shared_ptr指针的数量。 - expired():判断当前
weak_ptr指针为否过期(指针为空,或者指向的堆内存已经被释放)。 - lock():如果当前
weak_ptr已经过期,则该函数会返回一个空的shared_ptr指针;反之,该函数返回一个和当前weak_ptr指向相同的shared_ptr指针。
示例程序
#include #include void observe(std::weak_ptr weak){ if (auto observe = weak.lock()) { std::cout << "\tobserve() able to lock weak_ptr<>, value=" << *observe << "\n"; } else { std::cout << "\tobserve() unable to lock weak_ptr<>\n"; }}int main(){ std::weak_ptr weak; std::cout << "weak_ptr<> not yet initialized\n"; observe(weak); { auto shared = std::make_shared(42); weak = shared; std::cout << "weak_ptr<> initialized with shared_ptr.\n"; observe(weak); std::cout << "weak_ptr<> use_count() "<< weak.use_count() << ".\n"; std::weak_ptr weak2; weak2 = weak; std::cout << "after weak_ptr assignment, use_count is "<< weak.use_count() << ".\n"; weak.reset(); if (weak.expired()) std::cout << "weak_ptr expired, con not use\n"; } std::cout << "shared_ptr<> has been destructed due to scope exit.\n"; observe(weak);} 输出如下:
weak_ptr<> not yet initializedobserve() unable to lock weak_ptr<>weak_ptr<> initialized with shared_ptr.observe() able to lock weak_ptr<>, value=42weak_ptr<> use_count() 1.after weak_ptr assignment, use_count is 1.weak_ptr expired, con not useshared_ptr<> has been destructed due to scope exit.observe() unable to lock weak_ptr<> 关键词:
相关文章
-
c++中的weak_ptr的使用与理解
-
“古董车医生”刘志伟,40年功力成就专门巨匠
-
2023・钻石联赛厦门站——售票啦!
-
美联储鹰派官员倡继续加息:未来通胀放缓都不要停
-
兴安盟开展“构建和谐劳动关系宣传月”活动
-
取次花丛懒回顾什么意思(取次花丛懒回顾)
-
安徽省南陵县市场监管局多措并举加强机动车检验机构监管
-
呼和浩特市总工会举办“会聚良缘 情定军营”军地交友联谊活动
-
微信信息删除怎么恢复找回来(微信信息删除怎么恢复)
-
安徽省芜湖市繁昌区开展定量包装计量监督检查
-
安徽省肥西县市场监管局持续开展打击传销“皖剑-2023”专项行动
-
科技护肤时代来临,谁把握住了百亿赛道的机遇?
-
陕西省洋县发布暴雨橙色预警
-
卖菜不许开“美颜”!南京开展“生鲜灯”专项整治行动
-
以政领财提站位 以财辅政促发展
-
黑龙江省国资委召开全省地方国有企业2023年上半年经济运行分析会
-
江西抚州高新区市场监管局开展儿童用品监管行动
-
华虹半导体“冲刺”千亿市值,能否打破行业“老二盈利难”魔咒?
-
“中国(福建)—东盟经贸合作论坛”在福州举行
-
华为15亿成立地产公司?知情人士:只对内,不对外拓展房地产业务