智能指针: weak_ptr
2023年12月28日 2023年12月28日
通过weak_ptr访问shared_ptr管理的动态对象时:
- 支持检查动态对象是否有效
- 不会影响动态对象的引用计数
创建weak_ptr
默认初始化
1weak_ptr<T> w;
直接初始化
-
接受一个shared_ptr
-
接受一个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}