C++11新特性之weak_ptr智能指针

本节介绍最后一个智能指针------weak_ptr智能指针。

1.介绍

weak_ptr智能指针也是以模板类的方式实现的。同样定义在<memory>头文件,并位于std命名空间中。在使用前需包含这两条语句。

C++11虽然将weak_ptr当做智能指针,但该类型通常不单独使用,只能与shared_ptr类型指针搭配使用。通过weak_ptr指针,我们可以获取shared_ptr指针的状态信息,例如有多少个shared_ptr指向同一片堆内存,指向的堆内存是否被释放等。

注意,weak_ptr指针的指向与shared_ptr指针相同时,weak_ptr指针不会使指向堆内存的引用计数加1;同样,weak_ptr指针释放时,引用计数也不会减1。即weak_ptr不影响所指堆内存空间的引用计数。

weak_ptr没有重载*与->运算符,因此,weak_ptr指针只能访问所指堆内存,不能修改。

2.weak_ptr用法

(1)创建weak_ptr指针

1.创建一个空指针

cpp 复制代码
weak_ptr<int> wp1;

2.根据已有指针,创建新指针。

cpp 复制代码
weak_ptr<int> wp2 (wp1);

创建的wp2指针指向的堆内存空间与wp1相同。

3.利用shared_ptr指针初始化。

cpp 复制代码
shared_ptr<int> sp (new int);
weak_ptr<int> wp3 (sp);

(2)成员方法

  • operator=()------重载 = 赋值运算符,weak_ptr 指针可以直接被 weak_ptr 或者 shared_ptr 类型指针赋值。
  • swap(x)------ x 表示同类型的 weak_ptr 指针,该函数可以互换 2 个同类型 weak_ptr 指针的内容。
  • reset()------将当前 weak_ptr 指针置为空指针。
  • use_count()------查看指向与当前 weak_ptr 指针指向相同的 shared_ptr 指针的数量。
  • expired()------判断当前 weak_ptr 指针为否过期(指针为空,或者指向的堆内存已经被释放)。
  • lock()------如果当前 weak_ptr 已经过期,则该函数会返回一个空的 shared_ptr 指针;反之,该函数返回一个和当前 weak_ptr 指向相同的 shared_ptr 指针。

3.使用场景

(1)解决shared_ptr的循环引用问题。

循环引用是指两个或多个对象通过shared_ptr互相引用,导致引用计数永不为0,从而造成内存泄漏。使用weak_ptr代替shared_ptr可以打破这种循环引用。

(2)缓存与观察者模式

在缓存系统与观察者模式中,weak_ptr可以用于观测对象的生命周期。例如,缓存系统用weak_ptr存储对象的引用,当对象被销毁时,缓存自动失效。

4.总结

weak_ptr依赖于shared_ptr使用。更像是shared_ptr的一种辅助工具。具有以下特点:

1.weak_ptr不会影响指向对象的引用计数。

2.weak_ptr依赖于shared_ptr使用。

3.不影响对象生命周期。当weak_ptr指向对象被销毁,它会自动变为空指针。

相关推荐
2601_966949654 小时前
为什么量化策略需要大量历史股票数据?从回测可信度理解数据规模
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
niucloud-admin4 小时前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
anew___4 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
滕州市燕猫虎计算机科技工作室个体工商户4 小时前
Java锁
java·开发语言
多加点辣也没关系4 小时前
JavaScript|第31章:表单与控件
开发语言·javascript·ecmascript
菜鸟~noob2335 小时前
【电子战】 第09篇:阵列信号处理——波束形成、MVDR、MUSIC【含matlab代码】
开发语言·matlab·信号处理
ocean21035 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
零依赖极客5 小时前
Day 6·1 ARMv8.2 dotprod——vdotq_s32 一条指令做 4 个点积
c语言·开发语言·人工智能·矩阵·arm·vllm
stolentime5 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt6 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++