【C++进阶】:智能指针

news2024/11/14 20:23:13

智能指针

  • 一.为什么需要智能指针
  • 二.智能指针的原理和使用
    • 1.RALL
    • 2.auto_ptr
    • 3.unique_ptr
    • 4.shared_ptr

一.为什么需要智能指针

主要两点原因:
1.为了避免写代码时忘记delete导致的内存泄漏。
2.为了避免抛异常时跳过delete导致的内存泄漏。

在这里插入图片描述

1.new本身有可能出现异常,导致p1申请了空间但没直接跳过释放
2.调用div时出现异常,直接抛出异常的同时也跳过了delete.

二.智能指针的原理和使用

1.RALL

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:
1.不需要显式地释放资源。
2.采用这种方式,对象所需的资源在其生命期内始终保持有效。

在这里插入图片描述

上述的SmartPtr还不能将其称为智能指针,因为它还不具有指针的行为。指针可以解引用,也可以通过->去访问所指空间中的内容,因此:AutoPtr模板类中还得需要将* 、->重载下,才可让其像指针一样去使用。

2.auto_ptr

C++98版本的库中就提供了auto_ptr的智能指针。下面演示的auto_ptr的使用及问题。
auto_ptr的实现原理:管理权转移的思想,下面简化模拟实现了一份bit::auto_ptr来了解它的原
理。

在这里插入图片描述

在这里插入图片描述

可以发现auto_ptr有着严重的缺陷,所以目前很多公司都禁止使用它,对此我们也简单了解即可。

3.unique_ptr

C++11中开始提供更靠谱的unique_ptr

unique_ptr的实现原理:简单粗暴的防拷贝,下面简化模拟实现了一份UniquePtr来了解它的原
理。

在这里插入图片描述

4.shared_ptr

很明显unique_ptr有时候满足不了需求,所以需要一个更强大的智能指针。

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源

  1. shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共
    享。
  2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减
    一。
  3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
  4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对
    象就成野指针了。

在这里插入图片描述

循环引用

shared_ptr在大部分情况下都是可以正常使用的,但任有一些特殊情况导致内存泄漏:循环引用

在这里插入图片描述

在这里插入图片描述

这一段代码没有打印任何数据,说明ListNode也并没有进行析构,这是为什么呢?

循环引用分析:

  1. node1和node2两个智能指针对象指向两个节点,引用计数变成1,我们不需要手动
    delete。
  2. node1的_next指向node2,node2的_prev指向node1,引用计数变成2。
  3. node1和node2析构,引用计数减到1,但是_next还指向下一个节点且_prev还指向上
    一个节点。
  4. 也就是说_next析构了,node2就释放了。
  5. 也就是说_prev析构了,node1就释放了。
  6. 但是_next属于node的成员,node1释放了,_next才会析构,而node1由_prev管理,_prev
    属于node2成员,所以这就叫循环引用,谁也不会释放。

在这里插入图片描述

解决方案

很简单,将shared_ptr换成弱指针weak_ptr即可。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1079863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何导出带有材质的GLB模型?

1、为什么要使用 GLB 模型? GLB格式(GLTF Binary)是一种用于存储和传输3D模型及相关数据的文件格式,具有以下优点和作用: 统一性:GLB是一种开放标准的3D文件格式,由Khronos Group制定和维护。它融合了GL…

BUUCTF [BJDCTF2020]JustRE 1

查看文件信息 使用IDA打开 shift F12搜索字符串 发现类似flag的字符串 点进去 一路跟踪到汇编窗口,然后F5 sprintf将格式化后的字符串输出到String中 最终String的值为 printf("BJD{%d%d2069a45792d233ac}",19999,0);也就是 BJD{1999902069a45792d…

混淆技术研究笔记(四)反篡改介绍

先来看看AI的介绍,为了防止Java代码打包的JAR包被篡改,可以采取以下几种措施: 使用数字签名:可以使用Java的签名工具(如Jarsigner)对JAR包进行数字签名。签名可以确保JAR包的完整性和来源可信性。在验证JAR…

【eNSP】VLAN基础配置

一、基于接口划分VLAN(Access接口和Trunk接口) 1、创建VLAN LSW1 [LSW1]vlan batch 10 20 Info: This operation may take a few seconds. Please wait for a moment...done.LSW2 [LSW2]vlan batch 10 20 Info: This operation may take a few second…

女性必看——“黄体破裂”到底有多可怕?

前几天的亚运会上发生了这样一件事: 雅思敏(化名)是一名国外皮划艇运动员,在亚运会上奋力完成皮划艇比赛后,突然开始 剧烈腹痛、面色苍白,大汗淋漓,经过进一步检查,确诊卵巢黄体破裂…

三点式振荡器

相关说明 http://www.360doc.com/content/19/0527/16/61619294_838545271.shtml 高频信号发生器设计—电容三点式振荡电路_电容三点式振荡电路工作原理_北辰-尘的博客-CSDN博客 如上图所示,典型的Colpitts振荡电路。首先忽略所有的电阻,他们是用来设置…

Windows11与CentOS7.9 2009下安装配置nginx后启动整个项目

Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内容。 一、Windows11下安装配置nginx 1.1 下载 nginx官网 这里下载nginx-1.24.0-zip 下载完成后,解压到D:\develop\nginx-1.24.0,解压完成后在…

P1969 [NOIP2013 提高组] 积木大赛

思路&#xff1a; ACcode: #include<bits/stdc.h> using namespace std; #define int long long const int N1e510; int n,a[N],ans; void solve() {cin>>n;for(int i1;i<n;i)cin>>a[i];int ans0;for(int i1;i<n;i){if(a[i]>a[i-1]) ansa[i]-a[i-1…

C语言,序列中删除指定数字

题目考点&#xff1a;对continue的运用&#xff08;也可以用&#xff01;来实现&#xff09; 先创建一个数组&#xff0c;数组大小应该要根据题目要求&#xff0c;根据数据范围&#xff0c;要设立一个大小为50的数组。 接着用scanf输入n的值&#xff0c;再设一个循环&#xff…

学生台灯买什么样的好?双十一学生台灯推荐

不得不说光线会孩子的影响还是蛮大的&#xff0c;不仅会影响学习的效率&#xff0c;还会影响视力健康。很多家长认为孩子近视的主要原因是玩电子产品或者不良的坐姿、用眼习惯导致的&#xff0c;其实这些并不全是造成近视的因素&#xff0c;最主要的原因还是长时间的用眼导致的…

您这边是个人公众号还是企业公众号哈

公众号迁移有什么作用&#xff1f;只能变更主体吗&#xff1f;公众号迁移不只是可以实现公众号变更公司主体&#xff0c;还可以实现个人公众号变成企业公众号、服务号改成订阅号&#xff08;不过订阅号暂时不能改成服务号了&#xff0c;最新的规定&#xff09;&#xff0c;开通…

Spring源码解析——创建AOP代理之获取增强器

正文 在上一篇的博文中我们讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册&#xff0c;那么这个类到底做了什么工作来完成AOP的操作呢&#xff1f;首先我们看看AnnotationAwareAspectJAutoProxyCreator的层次结构&#xff0c;如下图所示&…

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测

分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测 目录 分类预测 | MATLAB实现KOA-CNN-BiGRU开普勒算法优化卷积双向门控循环单元数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现KOA-CNN-BiGRU开普勒算法优化…

codesys【读写轴参数】

在SM3_Basic库内。 作用&#xff1a;读写实轴寄存器参数。【一般用于修改2000h段的值】 或者获取6041h的状态值。 ecat主站操作&#xff1a; 补偿间隙&#xff1a; 追剪&#xff1a; 凸轮&#xff1a; 读写轴参数&#xff1a;

史上最全 结构型模式之 桥接 外观 组合 享元模式

史上最全 结构型模式之 代理 适配器 装饰者 模式-CSDN博客 5.4 桥接模式 5.4.1 概述 现在有一个需求&#xff0c;需要创建不同的图形&#xff0c;并且每个图形都有可能会有不同的颜色。我们可以利用继承的方式来设计类的关系&#xff1a; 我们可以发现有很多的类&#xff0c;假…

idea中maven plugin提示not found

在终端中输入&#xff1a; mvn dependency:resolve 然后 解决了部分问题 Plugin org.apache.maven.plugins:maven-jar-plugin:3.1.0 not found 改为3.3.0了 Plugin maven-source-plugin:3.3.0 not found 改为 2.4 了 版本下降了 感觉后继有坑 待观察

Ubuntu安装QQ

原文网址&#xff1a;2023在Ubuntu安装最新版QQ Linux v3.1.0 - 哔哩哔哩 作者&#xff1a;sprlightning https://www.bilibili.com/read/cv22100663/ 出处&#xff1a;bilibili 2022年末QQ推出了QQ Linux v3.0系列&#xff0c;目前最新版是今年2月24日推出的v3.1.0版本。注意…

GLTF纹理贴图工具让模型更逼真

1、如何制作逼真的三维模型&#xff1f; 要使三维模型看起来更加逼真&#xff0c;可以考虑以下几个方面&#xff1a; 高质量纹理&#xff1a;使用高分辨率的纹理贴图可以增强模型的细节和真实感。选择适合模型的高质量纹理图像&#xff0c;并确保纹理映射到模型上的UV坐标正确…

[ROS2系列] ubuntu 20.04测试rtabmap

目录 背景&#xff1a; 一、配置 turtlebot3 二、安装RTAB-Map ROS2包&#xff1a; 三、启动 Turtlebot3 模拟器&#xff1a; 四、启动 RTAB 地图&#xff1a; 五、启动导航&#xff08;nav2_bringup应安装软件包&#xff09;&#xff1a; 背景&#xff1a; 1、设备&…