六一的部落格


关关难过关关过,前路漫漫亦灿灿。



通过weak_ptr访问shared_ptr管理的动态对象时:

  1. 支持检查动态对象是否有效
  2. 不会影响动态对象的引用计数

创建weak_ptr


默认初始化

1weak_ptr<T> w;

直接初始化

  1. 接受一个shared_ptr

  2. 接受一个weak_ptr

1shared_ptr<T> sp = make_shared<T>(args);
2weak_ptr<T> w1(sp);
3weak_ptr<T> w2(w1);

示例

1auto p = make_shared<int>(10);
2weak_ptr<int> w1(p);
3weak_ptr<int> w2(w1);

赋值运算

右侧运算对象可以是shared_ptr,也可以是weak_ptr

1w = p;

示例

1auto sp = make_shared<int>(10);
2weak_ptr<int> w1, w2;
3
4w1 = sp;
5w2 = w1;

reset操作: 置空

1w.reset();

use_count操作: 返回联合管理动态对象的shared_ptr个数

1w.use_count();

expired操作: 判断动态对象是否有效

动态对象未被销毁返回true; 返回false

1w.expired();

lock操作: 返回管理该动态对象的shared_ptr

动态对象未被销毁返回shared_ptr; 返回nullptr

1w.lock();

示例

 1#include <iostream>
 2#include <memory>
 3
 4int main()
 5{
 6    auto sp = std::make_shared<int>(1);
 7    std::weak_ptr<int> wp(sp);                   // wp弱引用sp管理的动态对象; sp的引用计数未改变
 8
 9    if (std::shared_ptr<int> sp2 = wp.lock())
10    {
11        *sp2 = 3;                               // 通过sp2访问动态对象
12    }
13
14    std::cout << *sp << std::endl;
15    return 0;
16}

智能指针: weak_ptr


通过weak_ptr访问shared_ptr管理的动态对象时:

  1. 支持检查动态对象是否有效
  2. 不会影响动态对象的引用计数

创建weak_ptr


默认初始化

1weak_ptr<T> w;

直接初始化

  1. 接受一个shared_ptr

  2. 接受一个weak_ptr

1shared_ptr<T> sp = make_shared<T>(args);
2weak_ptr<T> w1(sp);
3weak_ptr<T> w2(w1);

示例

1auto p = make_shared<int>(10);
2weak_ptr<int> w1(p);
3weak_ptr<int> w2(w1);

赋值运算

右侧运算对象可以是shared_ptr,也可以是weak_ptr

1w = p;

示例

1auto sp = make_shared<int>(10);
2weak_ptr<int> w1, w2;
3
4w1 = sp;
5w2 = w1;

reset操作: 置空

1w.reset();

use_count操作: 返回联合管理动态对象的shared_ptr个数

1w.use_count();

expired操作: 判断动态对象是否有效

动态对象未被销毁返回true; 返回false

1w.expired();

lock操作: 返回管理该动态对象的shared_ptr

动态对象未被销毁返回shared_ptr; 返回nullptr

1w.lock();

示例

 1#include <iostream>
 2#include <memory>
 3
 4int main()
 5{
 6    auto sp = std::make_shared<int>(1);
 7    std::weak_ptr<int> wp(sp);                   // wp弱引用sp管理的动态对象; sp的引用计数未改变
 8
 9    if (std::shared_ptr<int> sp2 = wp.lock())
10    {
11        *sp2 = 3;                               // 通过sp2访问动态对象
12    }
13
14    std::cout << *sp << std::endl;
15    return 0;
16}