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 的循环引用。

目录

成员类型

成员类型 定义
element_type
T (C++17 前)
std::remove_extent_t<T> (C++17 起)

成员函数

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

非成员函数

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

推导指引(C++17 起)

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR 应用于 出版时的行为 正确行为
LWG 3001 C++17 未为数组支持更新 element_type 已更新

示例

演示如何通过锁来保证指针的有效性

#include <iostream>
#include <memory>
 
std::weak_ptr<int> gw;
 
void f()
{
    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;
 
	f();
    }
 
    f();
}

输出:

42
gw is expired

版本历史

  • (当前 | 先前 2017年11月16日 (四) 07:00Fruderica讨论 | 贡献 . . (2,474字节) (+166). . (+ DR) (撤销)
  • 当前 | 先前 2017年5月9日 (二) 07:52Fruderica讨论 | 贡献 . . (2,308字节) (-1). . (update) (撤销)
  • 当前 | 先前 2016年2月4日 (四) 23:32Wizardforcel讨论 | 贡献. . (2,309字节) (-9). . (撤销)
  • 当前 | 先前 2013年7月2日 (二) 09:08P12bot讨论 | 贡献 . . (2,318字节) (-199). . (Use {{lc}}. Update links. Various fixes.) (撤销)
  • 当前 | 先前 2012年11月16日 (五) 03:10Timothyqiu讨论 | 贡献 . . (2,517字节) (-12). . (remove machine translation note) (撤销)
  • 当前 | 先前 2012年11月16日 (五) 03:10Timothyqiu讨论 | 贡献. . (2,529字节) (-835). . (人工翻译) (撤销)
  • 当前 | 先前 2012年11月2日 (五) 13:52P12bot讨论 | 贡献 . . (3,364字节) (+217). . (r2.7.3) (机器人添加:de, en, es, fr, it, ja, pt, ru) (撤销)
  • 当前 | 先前 2012年10月27日 (六) 03:45P12讨论 | 贡献 . . (3,147字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前 2012年10月26日 (五) 06:00TranslationBot讨论 | 贡献. . (3,147字节) (-54). . (Translated from the English version using Google Translate) (撤销)
  • 当前 | 先前 2012年10月25日 (四) 14:56P12讨论 | 贡献 . . (3,201字节) (0). . (1个修订: Translate from the English version) (撤销)
  • 当前 | 先前) 2012年10月25日 (四) 12:00TranslationBot讨论 | 贡献. . (3,201字节) (+3,201). . (Translated from the English version using Google Translate)