std::weak_ptr
来自cppreference.com
在标头 <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 (公开成员函数) | |
为 weak_ptr 赋值 (公开成员函数) | |
修改器 | |
释放被管理对象的所有权 (公开成员函数) | |
交换被管理对象 (公开成员函数) | |
观察器 | |
返回管理该对象的 shared_ptr 对象数量 (公开成员函数) | |
检查被引用的对象是否已删除 (公开成员函数) | |
创建管理被引用的对象的 shared_ptr (公开成员函数) | |
提供弱指针的基于拥有者的排序 (公开成员函数) | |
(C++26) |
提供弱指针的基于所有者的散列 (公开成员函数) |
(C++26) |
提供弱指针的基于所有者的相等比较 (公开成员函数) |
非成员函数
(C++11) |
特化 std::swap 算法 (函数模板) |
辅助类
(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 可以作为无序关联容器的键
|
示例
演示如何通过锁来保证指针的有效性
运行此代码
#include <iostream> #include <memory> std::weak_ptr<int> gw; void observe() { std::cout << "gw.use_count() == " << gw.use_count() << "; "; // 使用之前必须制作一个 shared_ptr 副本 if (std::shared_ptr<int> spt = gw.lock()) std::cout << "*spt == " << *spt << '\n'; else std::cout << "gw 已过期\n"; } int main() { { auto sp = std::make_shared<int>(42); gw = sp; observe(); } observe(); }
输出:
gw.use_count() == 1: *spt == 42 gw.use_count() == 0: gw 已过期
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 3001 | C++17 | 未为数组支持更新 element_type
|
已更新 |
参阅
(C++11) |
拥有独有对象所有权语义的智能指针 (类模板) |
(C++11) |
拥有共享对象所有权语义的智能指针 (类模板) |