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
(公开成员函数) |
|
赋值
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
作为键值
|
示例
演示如何使用 lock 确保指针的有效性。
#include <iostream> #include <memory> std::weak_ptr<int> gw; void observe() { std::cout << "gw.use_count() == " << gw.use_count() << "; "; // we have to make a copy of shared pointer before usage: if (std::shared_ptr<int> spt = gw.lock()) std::cout << "*spt == " << *spt << '\n'; else std::cout << "gw is expired\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 is expired
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 3001 | C++17 |
element_type
未针对数组支持进行更新
|
已更新 |
参见
|
(C++11)
|
具有唯一对象所有权语义的智能指针
(类模板) |
|
(C++11)
|
具有共享对象所有权语义的智能指针
(类模板) |