网站首页 > 文章精选 正文
std::weak_ptr - cppreference.com
std::weak_ptr
std::weak_ptr
在标头 <memory> 定义 | |
template< class T > class weak_ptr; | (C++11 起) |
std::weak_ptr 是一种智能指针,它对被 std::shared_ptr 管理的对象存在非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 std::shared_ptr。
std::weak_ptr 用来表达临时所有权的概念:当某个对象只有存在时才需要被访问,而且随时可能被他人删除时,可以使用 std::weak_ptr 来跟踪该对象。需要获得临时所有权时,则将其转换为 std::shared_ptr,此时如果原来的 std::shared_ptr 被销毁,则该对象的生命期将被延长至这个临时的 std::shared_ptr 同样被销毁为止。
std::weak_ptr 的另一用法是打断 std::shared_ptr 所管理的对象组成的环状引用。若这种环被孤立(例如无指向环中的外部共享指针),则 shared_ptr 引用计数无法抵达零,而内存被泄露。能令环中的指针之一为弱指针以避免此情况。
成员类型
成员类型 | 定义 | ||||
element_type |
|
成员函数
(构造函数) | 构造新的weak_ptr |
(析构函数) | 销毁 weak_ptr |
operator= | 为weak_ptr赋值 |
修改器 | |
reset | 释放被管理对象的所有权 |
swap | 交换被管理对象 |
观察器 | |
use_count | 返回管理该对象的 shared_ptr 对象数量 |
expired | 检查被引用的对象是否已删除 |
lock | 创建管理被引用的对象的shared_ptr |
owner_before | 提供弱指针的基于拥有者顺序 |
非成员函数
std::swap(std::weak_ptr) (C++11) | 特化 std::swap 算法 |
辅助类
std::atomic<std::weak_ptr> (C++20) | 原子弱指针 |
推导指引(C++17 起)
注解
同 std::shared_ptr , weak_ptr 的典型实现存储二个指针:
- 指向控制块的指针;和
- 作为构造来源的 shared_ptr 的存储指针。
需要用分离的存储指针确保 shared_ptr 和 weak_ptr 间的来回转化正确进行,即使对于别名使用的 shared_ptr 。不可能不经将 weak_ptr 中的存储指针锁入 shared_ptr 就访问它。
功能特性测试宏 | 值 | 标准 | 功能特性 |
__cpp_lib_smart_ptr_owner_equality | 202306L | (C++26) | 使得 std::weak_ptr 可以作为 无序关联容器 的 key |
示例
演示如何通过锁来保证指针的有效性
运行此代码
#include <iostream>
#include <memory>
std::weak_ptr<int> gw;
void observe()
{
std::cout << "use_count == " << gw.use_count() << ": ";
if (auto spt = gw.lock()) { // 使用之前必须复制到 shared_ptr
std::cout << *spt << "\n";
}
else {
std::cout << "gw is expired\n";
}
}
int main()
{
{
auto sp = std::make_shared<int>(42);
gw = sp;
observe();
}
observe();
}
输出:
use_count == 1: 42
use_count == 0: gw is expired
猜你喜欢
- 2025-08-02 C++开发者都应该使用的十个C++11特性(上)
- 2025-08-02 如何实现自己的C++ unique_ptr?
- 2025-08-02 刚学会C++的小白用这个开源框架,做个 RPC 服务要多久?
- 2025-08-02 C++11+ 泛型编程(模板)
- 2025-08-02 abelkhan中的rpc框架
- 2025-08-02 C++设计模式:用代码演绎武侠世界的绝世神功
- 2025-08-02 视频分析与对象跟踪-扩展模块的单目标和多目标跟踪
- 2025-08-02 ROS2开发实践:ROS核心(节点、话题、服务、DDS通信协议等)
- 2025-08-02 C++语言程序员编程必收藏的20个经典实战案例(附完整源码)
- 2025-08-02 C# 控制电脑睡眠,休眠,关机以及唤醒
- 最近发表
- 标签列表
-
- newcoder (56)
- 字符串的长度是指 (45)
- drawcontours()参数说明 (60)
- unsignedshortint (59)
- postman并发请求 (47)
- python列表删除 (50)
- 左程云什么水平 (56)
- 编程题 (64)
- postgresql默认端口 (66)
- 数据库的概念模型独立于 (48)
- 产生系统死锁的原因可能是由于 (51)
- 数据库中只存放视图的 (62)
- 在vi中退出不保存的命令是 (53)
- 哪个命令可以将普通用户转换成超级用户 (49)
- noscript标签的作用 (48)
- 联合利华网申 (49)
- swagger和postman (46)
- 结构化程序设计主要强调 (53)
- 172.1 (57)
- apipostwebsocket (47)
- 唯品会后台 (61)
- 简历助手 (56)
- offshow (61)
- mysql数据库面试题 (57)
- fmt.println (52)