智能指针 weak_ptr

一、简介

1、是个类模板,指向一个由shared_ptr管理的对象,辅助shared_ptr 工作,weak_ptr不能控制对象的生命周期
2、将weak_ptr 绑定到shared_ptr 上,并不会改变shared_ptr 的引用计数,
当shared_ptr 需要释放对象时仍照常释放,不管是否有weak_ptr 指向该对象
3、weak_ptr不是一种独立的智能指针,不能用来操作指向的资源,weak_ptr能够监视它所指向的对象是否存在。
监视shared_ptr 的生命周期,是一种对shared_ptr 的扩充

二、创建

auto pi = make_shared(100);
(1) weak_ptr piw(pi); // 通过shared_ptr 创建,
// weak_ptr 的创建不影响强引用计数,但是会影响弱引用计数,只有强引用计数才影响对象的生命周期
(2) weak_ptr piw1;
piw1 = pi; // shared_ptr 赋值
(3) weak_ptr piw2;
piw2 = piw1; // weak_ptr 赋值

三、weak_ptr 的操作
1、lock()

// 检查weak_ptr 所指向的对象是否存在,如果该对象存在,则返回一个指向该对象的shared_ptr ,同时该对象的引用计数+1, 如果该对象不存在,则返回一个空的shared_ptr
shared_ptr pi2 = piw.lock(); // 使用情况

2、use_count() : 获取弱指针所指向对象的强引用计数(shared_ptr 的引用计数)

int i = piw.use_count();

3、expired()

是否过期,判断所观测的资源是否已经被释放掉,对象已经释放,返回true

4、reset()
将该弱指针设置为空,该对象的弱引用计数-1

四、weak_ptr 的尺寸
shared_ptr 和weak_ptr 的尺寸相同,里面包含两个裸指针
第一个裸指针:指向这个智能指针所指向的对象
第二个裸指针:指向一个很大的数据结构(控制块),其中包括:
(1)所指对象的强引用计数
(2)所指对象的弱引用计数
(3)其他数据,比如自定义的删除器的指针

上一篇:iOS-weak修饰的对象被释放时,weak指针自动被置为nil的实现原理


下一篇:ML————朴素贝叶斯原理和SKlearn相关库