c/c++ 智能指针 weak_ptr 使用

2023-11-09

智能指针 weak_ptr 使用

weak_ptr用途:

1,解决空悬指针问题
2,解决循环引用问题

weak_ptr特点:没有*操作和->操作


weak_ptr是不控制所指对象生存周期的智能指针,它指向由一个shared_ptr管理的对象。将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的计数器。一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放,即使有weak_ptr指向这个对象,对象也会被释放。

一,先来个表格,唠唠weak_ptr

操作 功能描述
weak_ptr<T> w 空weak_ptr,可以指向类型为T*的对象。
weak_ptr<T> w(sp) 与shared_sp sp指向相同对象的weak_ptr。T必须能转换为sp所指的类型。
w = p p可以是一个shared_ptr或一个weak_ptr。赋值后w指向p所指的对象。
w.reset() 将w置为空
w.use_count() 与w共享对象的shared_ptr的数量
w.expired() 若w.use_count()为0,返回true,否则返回false
w.lock() 如果expired()为true,返回一个空shared_ptr;否则返回一个指向w所指对象的shared_ptr。
小例子索引
代码块 功能描述
test1 weak_ptr不增加引用计数
test2 weak_ptr没有->和*操作
test3 lock使用
test4 循环引用,导致即使是智能指针也不能释放内存。用weak_ptr解决了循环引用,导致的内存不能释放的问题
小例子
#include <iostream>
#include <memory>
#include <vector>

using namespace std;

class Test{
public:
  Test(int d = 0) : data(d){cout << "new" << data << endl;}
  ~Test(){cout << "del" << data << endl;}
  void func(){cout << "func" << endl;}
private:
  int data;
};

//test4 循环引用,导致即使是智能指针也不能释放内存                              
class teacher;
class student;
class teacher{
public:
  teacher(){cout << "teacher()" << endl;}
  ~teacher(){cout << "del teacher" << endl;}
  shared_ptr<student> stu;
};
class student{
public:
  student(){cout << "student()" << endl;}
  ~student(){cout << "del student" << endl;}
  //如果换成shared_ptr<teacher> tea;就会形成循环引用,导致内存泄漏    
  weak_ptr<teacher> tea;
};
int main(){
  //test1 weak_ptr不增加引用计数                                                
  /*                                                                            
  shared_ptr<Test> sp1 = make_shared<Test>(1);                                  
  cout << sp1.use_count() << endl;//1                                           
  weak_ptr<Test> wp1 = sp1;                                                     
  cout << wp1.use_count() << endl;//1                                           
  */

  //test2 weak_ptr没有->和*操作                                                 
  //wp1->func();                                                                
  //(*wp1).func();                                                              

  //test3 lock使用                                                              
  /*                                                                            
  shared_ptr<int> sptr;                                                         
  sptr.reset(new int);                                                          
  *sptr = 10;                                                                   
  weak_ptr<int> weak1 = sptr;                                                   
  sptr.reset(new int);                                                          
  *sptr = 5;                                                                    
  weak_ptr<int> weak2 = sptr;                                                   
  // weak1 is expired!                                                          
  if(auto tmp = weak1.lock())                                                   
    cout << *tmp << '\n';                                                       
  else                                                                          
    cout << "weak1 is expired\n";                                               
  // weak2 points to new data (5)                                               
  if(auto tmp = weak2.lock())                                                   
    cout << *tmp << '\n';                                                       
  else                                                                          
    cout << "weak2 is expired\n";                                               
  */

  //test4 循环引用,导致即使是智能指针也不能释放内存                            
  //用weak_ptr解决了循环引用,导致的内存不能释放的问题                          
  shared_ptr<teacher> tptr(new teacher);//计数器1                               
  shared_ptr<student> sptr(new student);//计数器1                               
  tptr->stu = sptr;//sptr的计数器2                                              
  sptr->tea = tptr;//不增加tptr的引用计数,因为tea是weak指针                     
  cout << tptr.use_count() << endl;//1                                          
  cout << sptr.use_count() << endl;//2                                          

  return 0;
}

github完整代码

c/c++ 学习互助QQ群:877684253

1414315-20180929080507096-248557582.jpg

本人微信:xiaoshitou5854

转载于:https://www.cnblogs.com/xiaoshiwang/p/9721763.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c/c++ 智能指针 weak_ptr 使用 的相关文章

  • 松下 OPF CMOS影像传感器

    一 概述 不久前 松下在其国际网站公布了关于有机光电导膜 OPF CMOS影像传感器技术的最新研发进展 并表示该技术已趋于成熟 有望在未来一段时间内正式投入商用 此外 松下还在3月15日至16日 于英国伦敦举行的 Image Sensors
  • windows下安装clang+llvm(使用visual studio2017)或 为阅读llvm源码

    18 6 16更新 发现最开始的图片没有显示 现在更正了 LLVM对新手的链接 https clang llvm org get started html 为了更好地明白 下面是中文博客 再次表达感谢 https www cnblogs c
  • 数字信号处理知识点总结(四):快速傅里叶变换(FFT)

    本篇文章主要介绍快速傅里叶变换 FFT 的优化原理 基 2FFT算法的推导 实现及用FFT实现的线性卷积 主要参考知乎 精品讲义 快速傅里叶变换 Fast Fourier Transformation 以及一些数字信号处理的书籍整理而成 参
  • centos7安装elasticsearch-6.6.0

    1 下载elasticsearch 6 6 0 liucf node1 softfile wget https artifacts elastic co downloads elasticsearch elasticsearch 6 6 0
  • 《Java编程思想》(第4版)学习总结

    一次偶然的机会让我接触到了 Java编程思想 这本书 之前他们说是Thinking in Java 我当时并不知道 后来查资料的时候才知道是这本经典的书籍 于是就忍不住开始阅读了 开始感觉这本书讲解的东西不太理解 然后经过反复的思考才感觉有
  • WIN32API获取进程句柄的2种方式

    0x00 相关说明 Windows系统中 进程句柄是进程最重要的属性之一 在应用层可以通过进程句柄直接对指定进程的内存空间进行读写 0x01 通过进程名获取进程句柄 首先通过进程名得到进程ID 1 通过 CreateToolhelp32Sn
  • TNSName配置小结

    本文来自CSDN博客 http blog csdn net selfsupport archive 2010 07 11 5726303 aspx oracle网络配置 三个配置文件 listener ora sqlnet ora tnsn
  • SummerTTS - 开源本地编译运行,没有任何依赖,不需要联网,开箱即用的语音合成(TTS)项目

    推荐我的如下语音合成项目 TTS GitHub huakunyang SummerTTS SummerTTS 是一个基于C 的独立编译的中文语音合成项目 可以本地运行不需要网络 而且没有额外的依赖 一键编译完成即可用于中文语音合成 Summ
  • 指纹识别 matlab

    指纹识别主要包括这几个部分 指纹采集 指纹图像预处理 特征点提取 特征点匹配 输出显示 我们的大作业是指纹识别 matlab 找了很多资料 上面的程序要么不全 要么是有错误 下面是我找了很久并且能够运行的程序 下面是运行的图片
  • 如何把Application项目转为Library项目

    如何把Application项目转为Library项目 本篇文章针对项目里含有ButterKnife框架的情况 Module里的Build gradle apply plugin com android application 改成appl
  • 台达b3伺服参数设置方法_技术分享

    西门子博途的全套视频教程下载 西门子S7 1500内部培训资料下载 台达 ASDA 伺服定位演示系统 控制要求 1 由台达 PLC 和台达伺服组成一个简单的定位控制演示系统 通过 PLC 发送脉冲控制伺服 实现原点回归 相对定位和绝对定位功
  • Pytorch实战——气温预测(基础)附完整代码

    一 数据集 http 链接 https pan baidu com s 1mVAIWZquUyaCpgj1K51o5A 提取码 abcd 该数据集记录了一年内的气温信息 我们将针对于此进行分析 以上是部分数据情况 请查看 二 气温预测实战
  • 【Nginx】Nginx发布社区最新稳定版1.22.1版本

    Nginx官方于2022年10月19日发布了1 22稳定版的第一个分支版本 1 22 1 根据官方对于此版本的修改说明 可以发现该版本修复了一个安全漏洞 风险等级 中等 在使用ngx http mp4 module模块来处理一个特别构造的m
  • 在Java中使用HttpURLConnection发送http客户端请求、服务器端返回信息、接受服务器端的信息

    在最近的项目中要用到后台发送http请求 post 方式 获取服务器端返回哦信息 下面是自己做的一个简单的演示示例 首先创建一个web工程 简单的一个web工程就好 里面创建两个jsp和一个servlet 其中jsp作为客户端 而servl
  • Ubuntu个人终端常用命令

    Ubuntu终端提供了丰富的命令行工具和功能 现将一些基本的Ubuntu终端命令记录下来 方便查看 1 文件和目录管理命令 ls 列出当前目录下的文件和文件夹 cd 切换到指定目录 pwd 显示当前工作目录的路径 mkdir 创建新目录 r
  • Android Studio安装和使用教程(全文图解)

    目录 JDK安装与配置 一 下载JDK 二 JDK安装 三 JDK的环境配置 四 JDK的配置验证 Android studio安装 Android studio连接手机真机调试 以华为鸿蒙为例 一 新建一个android项目 二 进入项目
  • LeetCode刷题笔记:669.修剪二叉搜索树

    1 问题描述 给你二叉搜索树的根节点 root 同时给定最小边界low 和最大边界 high 通过修剪二叉搜索树 使得所有节点的值在 low high 中 修剪树 不应该 改变保留在树中的元素的相对结构 即 如果没有被移除 原有的父代子代关
  • Chrome浏览器的跨域设置

    做前后端分离的开发的时候 出于一些原因往往需要将浏览器设置成支持跨域的模式 而且chrome浏览器支持可跨域的设置 但是新版本的chrome浏览器提高了跨域设置的门槛 原来的方法不再适用了 其实网上也有很多大神总结的chrome跨域设置教程
  • 去耦电容的选择举例

    在高速时钟电路中 尤其要注意元件的RF去耦问题 究其原因 主要是因为元件会把一部分能量耦合到电源 地系统之中 这些能量以共模或差模RF的形式传播到其他部件中 陶瓷片电容需要比时钟电路要求的自激频率更大的频率 这样可选择一个自激频率在10 3
  • JavaWeb酒店管理系统

    酒店管理系统 一 项目介绍 1 项目用到的技术栈 开发工具 idea 语言 java js html ajax 数据库 MySQL 服务器 Tomcat 框架 mybatis jQuery 2 项目实现功能 管理员和用户登录和退出功能以及用

随机推荐

  • ParameterizedType应用,java反射,获取参数化类型的class实例

    ParameterizedType是一个接口 这个类可以用来检验泛型是否被参数化 比如 class Dao
  • python https RecursionError详解

    RecursionError maximum recursion depth exceeded while calling a Python object File root miniconda3 envs devops lib pytho
  • Ubuntu下安装Pytorch

    安装CPU版本 https www cnblogs com wangqinze p 13407610 html 完成后检验是否有误 python import torch import torchvision 若没有报错则完成 安装GPU版
  • CMake I 设置语言标准

    目录 一
  • docker基础篇-docker的安装、配置、卸载,自定义镜像和搭建公有和私有镜像仓库

    本篇主要是docker的安装 配置 卸载 自定义镜像和搭建公有和私有镜像仓库 以及常规软件安装示例 mysql主从 redis主从搭建 Dockerfile解析及docker compose编排等见另一篇文章 docker高级篇 mysql
  • python之正则表达式:匹配ip地址

    首先分析ip地址的特征 255 255 255 255 1位 0 9 0 9 d 2位 10 99 1 9 d 2位以内 1 9 d 3位 100 199 1 d 2 3位 200 249 2 0 4 d 3位 250 255 25 0 5
  • 如何让opencv成为MATLAB中的一个工具箱

    如何让opencv成为MATLAB中的一个工具箱 前言 谈到图像处理的编程工具 MATLAB和opencv是最经常提到的 两者各有优缺点 比如 MATLAB的数据可视化做得很好 而且还有其它可以方便调用的工具箱 但是在图像的处理上面 不如o
  • IDEA快速生成方法

    快捷键 Alt Insert 按下快捷键之后会弹出如下界面 依次是Constructor方法 Getter方法 Setter方法 Getter 和Setter方法 equa 和 hashCode 方法 toString方法 Override
  • 三大通信协议(3)SPI——寄存器配置

    目录 一 SPI通信协议简介 二 SPI通信时序 1 主从通信 2 模式选择 三 实例 总结 一 SPI通信协议简介 SPI是串行外设接口 Serial Peripheral Interface 的缩写 是 Motorola 公司推出的一种
  • windows下expect使用小结

    最近因为学习tcl脚本语言 需要用到expect扩展包 结合网上的资料和自己的学习情况做一下整理 expect是一种基于TCL的解释型脚本语言 能够实现自动和交互式任务进行通信 而无需人的干预 expect由一系列expect send对组
  • SpringBoot结合MyBatis实现多数据源配置

    SpringBoot结合MyBatis实现多数据源配置 一 前提条件 1 1 环境准备 SpringBoot框架实现多数据源操作 首先需要搭建Mybatis的运行环境 由于是多数据源 也就是要有多个数据库 所以 我们创建两个测试数据库 分别
  • Unity【LayerMask】层级关系以及代码对层级的控制

    LayerMask的存储 LayerMask的每一个层级都是一个二进制数字 实际上LayerMash是32位的二进制记录的 每一个层级对应一个二进制位置 所以理论上Unity最多能有32个层级关系 为了方便解释以下列表假设只有5位二进制数据
  • Qt:FTP 与 QFtp 实现文件传输(C++: ftplib)

    目录 C 与 FTP 1 1 简介 1 2 工作原理 1 2 1 独特优势 1 2 2 基本模型 1 3 用户与传输 1 3 1 用户分类 1 3 2 传输方式 1 3 3 传输模式 1 4 控制命令 实现方式 2 1 QFtp 2 2 Q
  • eml文件是什么格式的文件?怎么打开?怎么导出eml文件?

    eml格式文件是一个电子邮件文件 其格式名由来是E mail 电子邮件 的缩写形式 一个eml文件打开后就是一封电子邮件 E mail 它是电子邮件导出后的格式 163 QQ等使用较多的邮件服务商都有邮件导出功能 导出后的文件就是eml格式
  • cmake的add_subdirectory

    命令格式 add subdirectory source dir binary dir EXCLUDE FROM ALL 添加一个子目录并构建该子目录 如果想同时编译多个CmakeLists txt 可以使用add subdirectory
  • cmakelist的作用及使用

    cmakelist的作用及使用 cpp平常的运行方式 cpp为编译型语言 需要把cpp文件编译成可执行文件 然后执行可执行文件 gcc main cpp o main 执行该可执行文件 main 但由于一些依赖错综复杂 且需要大量指令依次执
  • INS/GNSS组合导航(七)-SINS的微分方程的推导

    三 中对SINS的机械编排进行了初步可行性的介绍 并未对机械编排进行原理性介绍 那么在详细介绍机械编排之前 需要先对SINS的微分方程进行详细的推导 无论是机械编排 还是后面误差方程的建立 SINS的微分方程都是其重要的基础内容 那么本文在
  • 原神--原学入门--元素结晶盾盾值计算

    由于在角色的元素精通面板是可以看到分为了四类加成 其中一项便是对于结晶反应得到的元素护盾的增幅 于是便开始着手学习相关的计算 便览众多说法 最终都是归一为了如同文章 数据讨论 结晶反应护盾值计算相关 NGA玩家社区 的说法一样的计算方法 1
  • 2020年第十一届蓝桥杯javaB组省赛

    文章目录 试题 A 门牌制作 试题 B 寻找 2020 试题 C 蛇形填数 试题 D 七段码 试题 E 排序 试题 F 成绩分析 试题 G 单词分析 试题 H 数字三角形 试题 I 子串分值和 试题 J 装饰珠 以下均为个人想法和解题思路
  • c/c++ 智能指针 weak_ptr 使用

    智能指针 weak ptr 使用 weak ptr用途 1 解决空悬指针问题 2 解决循环引用问题 weak ptr特点 没有 操作和 gt 操作 weak ptr是不控制所指对象生存周期的智能指针 它指向由一个shared ptr管理的对