Namespaces
Variants

std:: weak_ptr

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
定义于头文件 <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

T

(C++17 前)

std:: remove_extent_t < T >

(C++17 起)

成员函数

创建新的 weak_ptr
(公开成员函数)
销毁 weak_ptr
(公开成员函数)
赋值 weak_ptr
(公开成员函数)
修改器
释放被管理对象的所有权
(公开成员函数)
交换被管理对象
(公开成员函数)
观察器
返回管理该对象的 shared_ptr 对象数量
(公开成员函数)
检查被引用的对象是否已被删除
(公开成员函数)
创建管理被引用对象的 shared_ptr
(公开成员函数)
提供基于所有者的弱指针排序
(公开成员函数)
(C++26)
提供基于所有者的弱指针哈希
(公开成员函数)
提供基于所有者的弱指针相等比较
(公开成员函数)

非成员函数

特化 std::swap 算法
(函数模板)

辅助类

原子弱指针
(类模板特化)

推导指南 (自 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)
具有共享对象所有权语义的智能指针
(类模板)