当前位置: 首页 > news >正文

C++——智能指针

前言:哈喽小伙伴们,今天我们继续来分享C++的一个全新知识——智能指针。


目录

一.何为智能指针

 RAII

 二.智能指针的种类

三.内存泄漏

结语


一.何为智能指针

 RAII

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

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

借由RAII的思想,我们引出智能指针

template<class T>
class SmartPtr {
public:SmartPtr(T* ptr = nullptr): _ptr(ptr){}~SmartPtr(){if(_ptr)delete _ptr;}
private:T* _ptr;
};
void Func()
{SmartPtr<int> sp1(new int);SmartPtr<int> sp2(new int);cout << div() << endl;
}

 所谓智能指针,就是通过一个类来控制指针对象的存亡,通过这种方式创建的对象,只要函数退出,就会自动执行其析构函数


 二.智能指针的种类

上述我们所实现的,只是智能指针的基础部分,那么在C++的库中,是包含很多种智能指针的:

  • auto_ptr
  • unique_ptr
  • shared_ptr

这三种智能指针,在智能指针之间的拷贝赋值中有所区别

auto_ptr指针如果进行拷贝,是通过转移管理权的思想,也可以理解为移动构造,直接争夺资源,但是并不会造成原指针的销毁,而是置空。

unique_ptr指针简单粗暴,直接就是禁止进行拷贝。

能够看出,上述两种智能指针,都不允许指针之间进行数据共享,而shared_ptr却可以: 

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

其具体实现方式为:

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

 再日常使用中,shared_ptr是最常用也是最推荐的智能指针。


三.内存泄漏

那么我们设计智能指针的目的,就是为了防止发生内存泄漏

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。


结语

关于智能指针就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • springboot山东外事职业大学校园食堂点餐系统-计算机毕业设计源码10417
  • 前端常用的性能优化方案
  • Pandas行列变换指南:数据重塑的艺术
  • LeetCode刷题笔记 | 3 | 无重复字符的最长子串 | 双指针 | 滑动窗口 | 2025兴业银行秋招笔试题 | 哈希集合
  • 连接未来:幂简集成引领API新时代
  • 大数据技术原理-Hadoop的安装
  • c++ 初始值设定项列表(initializer_list)
  • 大模型日报 2024-08-03
  • 解决电脑缺少.NET组件?手把手教你轻松解决
  • Go语言实现多协程文件下载器
  • 【Java 第六篇章】泛型
  • 聚鼎科技:装饰画怎么做盈利更快
  • C# 实现改造 GooFlow 流程图插件与数据库应用的结合
  • Linux系统性能调优实战:从基础到进阶的全方位指南
  • 【C++修炼之路 第七章】模拟实现 list 类模板
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • js递归,无限分级树形折叠菜单
  • 百度小程序遇到的问题
  • 编写高质量JavaScript代码之并发
  • 当SetTimeout遇到了字符串
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • raise 与 raise ... from 的区别
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • 整理一些计算机基础知识!
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ![CDATA[ ]] 是什么东东
  • #define,static,const,三种常量的区别
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)fgets与fputs函数详解
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)ssm高校实验室 毕业设计 800008
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .Net 6.0 处理跨域的方式
  • .NET CLR基本术语
  • .net core 6 redis操作类
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 反射的使用
  • .NET构架之我见
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • @SpringBootApplication 包含的三个注解及其含义
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [Angular] 笔记 6:ngStyle
  • [C#学习笔记]Newtonsoft.Json
  • [C++]类和对象(中)