当前位置: 首页 > news >正文

C++11: std::weak_ptr

1. 简介

weak_ptr智能指针的一种,主要是为了解决shared_ptr循环引用的问题。

2. 使用

weak_ptr主要有两种构造方式,一种是从shared_ptr,另外是一种是weak_ptr

下面是一个例子,use_count是引用计数。

可以看到weak_ptr并不会增加引用计数。

#include <iostream>
#include <memory>int main()
{std::shared_ptr<int> sp( new int);std::weak_ptr<int> wp1; std::weak_ptr<int> wp2(wp1);std::weak_ptr<int> wp3(sp);std::cout << "use_count" << '\n';std::cout << "wp1: " << wp1.use_count() << '\n';std::cout << "wp2: " << wp2.use_count() << '\n';std::cout << "wp3: " << wp3.use_count() << '\n';return 0;
}

输出

use_count
wp1: 0
wp2: 0
wp3: 1

由于我weak_ptr只有对象的使用权而不管理对象的生命周期,

所以需要expired()先来判断使用的这个对象有没有过期。

下面是一个例子

#include <iostream>
#include <memory>int main () {std::shared_ptr<int> shared (new int(10));std::weak_ptr<int> weak(shared);std::cout << "1. weak " << (weak.expired()?"is":"is not") << " expired\n";shared.reset();std::cout << "2. weak " << (weak.expired()?"is":"is not") << " expired\n";return 0;
}

reset是将shared_ptr所管理的对象给释放掉,换成新的或者置空。

输出的结果

1. weak is not expired
2. weak is expired

还有一个比较重要的方法是lock是从weak_ptr恢复一个shared_ptr,如果对象没有过期的话。下面是一个例子。

#include <iostream>
#include <memory>int main () {std::shared_ptr<int> sp1,sp2;std::weak_ptr<int> wp;// sharing group:// --------------sp1 = std::make_shared<int> (20);    // sp1wp = sp1;                            // sp1, wpsp2 = wp.lock();                     // sp1, wp, sp2std::cout << "use_count: " << wp.use_count() << '\n';sp1.reset();                         //      wp, sp2std::cout << "use_count: " << wp.use_count() << '\n';sp1 = wp.lock();                     // sp1, wp, sp2std::cout << "use_count: " << wp.use_count() << '\n';std::cout << "*sp1: " << *sp1 << '\n';std::cout << "*sp2: " << *sp2 << '\n';return 0;
}

结果

use_count: 2
use_count: 1
use_count: 2
*sp1: 20
*sp2: 20

3. 应用场景

  • 解决循环引用
#include <iostream>
#include <memory>struct Node {Node(int v):v_(v){}std::shared_ptr<Node> next;  // Points to the next nodestd::weak_ptr<Node> prev;   // Points to the previous node~Node() {std::cout << "Node  "<< v_ <<" destroyed\n";}int v_;
};int main() {auto node1 = std::make_shared<Node>(1);auto node2 = std::make_shared<Node>(2);node1->next = node2;        // node1 points to node2node2->prev = node1;        // node2 points to node1 using weak_ptrreturn 0;  // No memory leak occurs due to the use of weak_ptr
}

输出结果

Node  1 destroyed
Node  2 destroyed

如果使用两个shared_ptr相互之间等待,程序就不会正常退出了。

  • 作缓存,只享用使用权不管理生命周期
 class RuleHandle{std::weak_ptr<BasicRule> rule_weak_ptr_;public:template<class RuleType>explicit RuleHandle( const std::shared_ptr<RuleType> x ) : rule_weak_ptr_( x ){}void cancel();};

4. 参考

cplusplus.com
simplifycpp
qiang-zhihu

http://www.dtcms.com/a/347862.html

相关文章:

  • 单片机的输出模式推挽和开漏如何选择呢?
  • leetcode算法刷题的第十六天
  • std::exchange详解
  • 智慧交通夜间逆光误检率↓81.4%!陌讯多模态融合算法在主干道监测的落地优化
  • 暴雨环境漏检率下降78%!陌讯动态融合算法在道路积水识别的工程突破
  • 电感反射特性
  • dinov3使用介绍
  • 【51单片机】【protues仿真】 基于51单片机储物箱系统
  • 企业智脑智能体开发全解析
  • docker的基础配置
  • SEO优化工具学习——Ahrefs进行关键词调研(包含实战)
  • 元宇宙的未来展望:机遇、风险与人类社会的新形态
  • FLOPs、TFLOPs 与 TOPS:计算能力单位
  • pig框架导入总结
  • Claude Code 新手使用入门教程
  • 第2题 - 登山鞋(C++实现)
  • 计算机组成原理(12) 第二章 - 主存储器的基本组成
  • 遥感机器学习入门实战教程|Sklearn案例⑨:数据预处理(Processing)
  • 基于STM32的智能温室控制系统设计
  • 【yocto】Yocto Project 配置层(.conf)文件语法详解
  • Service详解
  • 鸿蒙异步处理从入门到实战:Promise、async/await、并发池、超时重试全套攻略
  • 【C++】全局变量/静态变量的初始化时机
  • 基于电力电子变压器的高压脉冲电源方案复现
  • 最小覆盖子串+滑动窗口
  • 【JVM内存结构系列】二、线程私有区域详解:程序计数器、虚拟机栈、本地方法栈——搞懂栈溢出与线程隔离
  • mysql为什么使用b+树不使用红黑树
  • tcpdump命令打印抓包信息
  • 用vscode使用git工具
  • 深度优先搜索(DFS)和广度优先搜索(BFS)