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
的操作能够正确执行,即使对于别名 shared_ptr
也是如此。 在不将 weak_ptr
锁定到 shared_ptr
的情况下,无法访问 weak_ptr
中的存储指针。
功能测试 宏 | 值 | Std | 功能 |
---|---|---|---|
__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() << "; "; // 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++ 标准。
DR | 应用到 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3001 | C++17 | element_type 未针对数组支持更新 |
已更新 |
[编辑] 另请参阅
(C++11) |
具有唯一对象所有权语义的智能指针 (类模板) |
(C++11) |
具有共享对象所有权语义的智能指针 (类模板) |