std::weak_ptr::weak_ptr

来自cppreference.com
< cpp‎ | memory‎ | weak ptr
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
动态内存管理
 
 
constexpr weak_ptr() noexcept;
(1) (C++11 起)
weak_ptr( const weak_ptr& r ) noexcept;
(2) (C++11 起)
template< class Y >
weak_ptr( const weak_ptr<Y>& r ) noexcept;
(2) (C++11 起)
template< class Y >
weak_ptr( const std::shared_ptr<Y>& r ) noexcept;
(2) (C++11 起)
weak_ptr( weak_ptr&& r ) noexcept;
(3) (C++14 起)
template< class Y >
weak_ptr( weak_ptr<Y>&& r ) noexcept;
(3) (C++14 起)

构造新的 weak_ptr ,潜在地与 r 共享对象的。

1) 默认构造函数。构造空 weak_ptr
2) 构造新的 weak_ptr ,它共享 r 所管理的对象。若 r 不管理对象,则 *this 亦不管理对象。模板重载不参与重载决议,除非 Y* 可隐式转换为 T* ,或 Y 是某类型 U 和某数 N 的“ NU 的数组”类型,而 T 是“(可有 cv 限定的) U 的未知边界数组”类型 (C++17 起)
3) 移动构造函数。从 r 移动 weak_ptr 实例到 *this 。之后, r 为空且 r.use_count()==0 。模板重载不参与重载决议,除非 Y* 可隐式转换为 T*

目录

[编辑] 参数

r - 将为此 std::weak_ptr 所查看的 std::shared_ptrstd::weak_ptr

[编辑] 注意

因为默认构造函数是 constexpr ,静态 weak_ptr 会作为静态非局部初始化的一部分初始化,在任何动态非局部初始化之前。这使得在任何静态对象的构造函数中使用 weak_ptr 是安全的。

[编辑] 示例

#include <memory>
#include <iostream>
 
struct Foo {};
 
int main()
{
   std::weak_ptr<Foo> w_ptr;
 
   {
      auto ptr = std::make_shared<Foo>();
      w_ptr = ptr;
      std::cout << "w_ptr.use_count() inside scope: " << w_ptr.use_count() << '\n';
   }
 
   std::cout << "w_ptr.use_count() out of scope: " << w_ptr.use_count() << '\n';
   std::cout << "w_ptr.expired() out of scope: " << std::boolalpha << w_ptr.expired() << '\n';
}

输出:

w_ptr.use_count() inside scope: 1
w_ptr.use_count() out of scope: 0
w_ptr.expired() out of scope: true

[编辑] 参阅

weak_ptr赋值
(公开成员函数) [编辑]