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

C++笔记-智能指针的使用及其原理

智能指针的使用场景分析

在我们上一篇讲解异常的时候,这部分的代码我们指出了一种情况,我们来回顾一下:如果array2的new失败了,抛出了异常,就会导致内存泄漏的问题。

而在上一篇中我们也给出了解决方法,也就是array1和array2都放在try/catch语句中,但是这种方法代码重复度高,并且代码也不美观,所以这篇的智能指针就是为了解决这类问题而出现的。

2.RAII和智能指针的值设计思路

RAII是Resource Acquisition Is Initialization的缩写,他是⼀种管理资源的类的设计思想,本质是

⼀种利⽤对象⽣命周期来管理获取到的动态资源,避免资源泄漏,这⾥的资源可以是内存、⽂件指

针、⽹络连接、互斥锁等等。RAII在获取资源时把资源委托给⼀个对象,接着控制对资源的访问,

资源在对象的⽣命周期内始终保持有效,最后在对象析构的时候释放资源,这样保障了资源的正常

释放,避免资源泄漏问题。

能指针类除了满⾜RAII的设计思路,还要⽅便资源的访问,所以智能指针类还会想迭代器类⼀

样,重载 operator*/operator->/operator[] 等运算符,⽅便访问资源。

下面我们来实现一个简单的智能指针:

上图就是我们所实现的智能指针,看起来并不复杂对吧,在这里确实不复杂,复杂的情况我们下面再讲。

上面我们就通过智能指针来控制array1和array2中的资源,并且我在里面重载实现了*/->/[]等运算符,使其使用起来更像一个指针。

而从上面的输出结果过我们可以看出来,不需要try/catch语句来捕捉new的异常,我们依然可以顺利释放array1和array2中的资源,第二张图就是简化过的代码,此时代码看起来就要比上面的简洁和美观许多。

此时array1和array2的生命周期就和智能指针一样,在当前函数的栈帧结束后,就会通过析构函数一起进行释放。

3.C++标准库智能指针的使用

我们都想到这个问题,C++委员会当然也想到了这种问题,所以C++标准库中也引入了智能指针,C++标准库中的智能指针都在<memory>这个头⽂件下⾯,我们包含<memory>就可以使⽤了, 智能指针有好⼏种,除了weak_ptr他们都符合RAII和像指针⼀样访问的⾏为,原理上⽽⾔主要是解决智能指针拷⻉时的思路不同。

auto_ptr 是C++98时设计出来的智能指针,他的特点是拷⻉时把被拷⻉对象的资源的管理权转移给

拷⻉对象,这是⼀个⾮常糟糕的设计,因为它会使被拷⻉对象悬空,访问报错的问题,C++11设计

出新的智能指针后,强烈建议不要使⽤auto_ptr。其他C++11出来之前很多公司也是明令禁⽌使⽤

这个智能指针的。

我们创建一个Date类举例,此时我们对ap1进行了初始化,并且将ap1赋值给ap2,然后我们再通过ap1对其资源进行修改,此时代码看起来没有问题是吧,我们运行一下来看:

此时就会报错,原因上面也说了,ap1赋值给ap2后,这块资源的管理权就发生了变换,ap1就无权在管理这块资源,所以我们再通过ap1来对资源的数据进行修改就会报上面的错误。

我们通过调试来观察ap1和ap2的变化,第一张图是还没有赋值的时候ap1的情况,此时的是数据就是没问题的,而第二张图就是赋值之后ap1和ap2的变化,可以看出底层对于管理权的交换其实就是将进行赋值的智能指针置为空,这样就没有办法再管理资源。

http://www.jsqmd.com/news/454488/

相关文章:

  • 百联 OK 卡回收全攻略:避坑 + 安全变现,手把手教你三步搞定 - 团团收购物卡回收
  • 股票配资怎么选?这份靠谱平台推荐榜单请收好(十大交易指南) - 资讯焦点
  • Flutter 三方库 darto 的鸿蒙化适配指南 - 实现极简的数据传输对象(DTO)映射、助力鸿蒙端业务模型轻量化构建
  • 2026年口碑最好的三家配资平台 - 资讯焦点
  • Flutter 三方库 bip32 的鸿蒙化适配指南 - 掌握分层确定性钱包(HD Wallets)核心算法、助力鸿蒙端 Web3 资产安全治理体系建设
  • C++ 条件判断与循环全解:从入门到避坑指南
  • 2026年NMN哪个牌子最好?全网热销NMN排行榜前十名排名实测对比 - 资讯焦点
  • 126.Java深入学习之JVM四
  • SpringColoud GateWay 核心组件
  • 【C++】类和对象--类中6个默认成员函数(2) --运算符重载
  • 2026年环保透气不闷汗床垫推荐:五款深度横评,帮你找到会“呼吸”的健康好床垫 - 资讯焦点
  • Zero Autonomous Thinking:面向OpenClaw的自主意识智能体框架
  • Spring中的IOC详解
  • Linux内核驱动开发“武功秘籍”——金庸与古龙江湖的修炼之道
  • 2026年NMN十大品牌排行榜:哪个品牌效果最好?口碑、性价比全对比 - 资讯焦点
  • 梅森素数VS是(四)素数
  • SpringSecurity之跨域
  • 从0开始学习C++:C/C++ 输入输出全攻略
  • SpringMVC的工作流程
  • 国内信创实时云渲染服务商怎么选?靠谱标准看这几点
  • C++ 手写实现 unordered_map 和 unordered_set:深入解析与源码实战
  • 【Linux系统】进程状态 | 进程优先级
  • 中小企业布局信创实时云渲染,可行吗?
  • C++ 定长内存池,让内存分配快到飞起!
  • 信创实时云渲染与传统本地渲染,企业选型该瞄准哪些核心点?
  • 【毕业设计】SpringBoot+Vue+MySQL 医院信管系统平台源码+数据库+论文+部署文档
  • SpringBoot+Vue 智能菜谱推荐系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • C++ 异常处理机制详解:从基础语法到工程实践
  • 2026年江苏变压器铜铝排/变压器铜电磁线/变压器铝电磁线服务商采购白皮书:高压输配电领域的核心供应商竞争力解析 - 2026年企业推荐榜
  • Flutter 三方库 ntp_dart 的鸿蒙化适配指南 - 获取绝对可信的授时服务、助力鸿蒙端金融与考勤类应用杜绝本地时钟作弊风险