条款13:以对象管理资源

文章目录

  • 没有管理的情况
  • 解决办法之unique_ptr智能指针
  • 解决办法之shared_ptr智能指针
  • 总结

没有管理的情况

 资源是指一旦你使用完它,就需要返回系统的东西。

class Investment { ... }; // 投资类型层次结构的基类
Investment* createInvestment(); // 工厂函数,调用者必须负责回收指向的对象内存// (为简单起见,省略参数。)
void f()
{Investment* pInv = createInvestment(); // 调用工厂函数... // 使用 pInvdelete pInv; // 释放对象
}

如果…中发生异常,或退出,将不会调用delete。
在这里插入图片描述
这边我们直接return模拟该情况。

解决办法之unique_ptr智能指针

通过将资源放在对象中,我们可以依靠C++的自动析构函数调用来确保资源被释放。
unique_ptr是一个类指针对象(智能指针),其析构函数会自动调用delete。

void f()
{std::unique_ptr<Investment> pInv(createInvestment()); // 调用工厂函数... // 使用 
} // 通过auto_ptr的析构函数自动删除pInv
  • 使用对象管理资源的想法通常被称为资源获取即初始化(RAII,Resource Acquisition Is Initialization)。
  • 析构函数会在对象被销毁时自动调用(例如,当对象超出作用域时),所以不管程序如何离开作用域(块),资源都会被正确地释放。
  • unique_ptr是独占式的智能指针:unique_ptr 删除了 copy constructor 和 copy assignment operator !
std::unique_ptr<Investment> pInv1(createInvestment()); std::unique_ptr<Investment> pInv2(pInv1); // 错误
pInv1 = pInv2; // 错误

解决办法之shared_ptr智能指针

 unique_ptr并不是管理所有动态分配资源的最佳方法。替代方案是引用计数智能指针。

void f()
{...std::shared_ptr<Investment> pInv1(createInvestment()); // pInv1指向createInvestment返回的对象std::shared_ptr<Investment> pInv2(pInv1); pInv1 = pInv2; // 现在,pinv1和pInv2都指向同一个对象...
} // pInv1和pInv2会被销毁,它们所指向的对象也会被自动删除

在这里插入图片描述
注意的地方:unique_ptr和shared_ptr在它们的析构函数中都使用delete,而不是delete[]。

std::unique_ptr<std::string> 
aps(new std::string[10]); // 坏主意!错误的delete方式将被使用
std::shared_ptr<int> spi(new int[1024]); // 同样的问题

总结

  • 为了防止资源泄漏,使用RAII对象,它们在构造函数中获取资源,并在析构函数中释放资源。
  • 两个常用的RAII类是shared_ptr和unique_ptr。shared_ptr通常是更好的选择,因为它在复制时的行为很直观。

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

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

相关文章

2022–2023学年2021级计算机科学与技术专业数据库原理 (A)卷

一、单项选择题&#xff08;每小题1.5分&#xff0c;共30分&#xff09; 1、构成E—R模型的三个基本要素是&#xff08; B &#xff09;。 A&#xff0e;实体、属性值、关系 B&#xff0e;实体、属性、联系 C&#xff0e;实体、实体集、联系 D&#xff0e;实体、实体…

html-css-js移动端导航栏底部固定+i18n国际化全局

需求&#xff1a;要做一个移动端的仿照小程序的导航栏页面操作&#xff0c;但是这边加上了i18n国家化&#xff0c;由于页面切换的时候会导致国际化失效&#xff0c;所以写了这篇文章 1.效果 切换页面的时候中英文也会跟着改变&#xff0c;不会导致切换后回到默认的语言 2.实现…

oracle 9i10g编程艺术-读书笔记1

根据书中提供的下载代码链接地址&#xff0c;从github上找到源代码下载地址。 https://github.com/apress下载好代码后&#xff0c;开始一段新的旅行。 设置 SQL*Plus 的 AUTOTRACE 设置 SQL*Plus 的 AUTOTRACE AUTOTRACE 是 SQL*Plus 中一个工具&#xff0c;可以显示所执行…

分布式数据库事务故障恢复的原理与实践

关系数据库中的事务故障恢复并不是一个新问题&#xff0c;自70年代关系数据库诞生之后就一直伴随着数据库技术的发展&#xff0c;并且在分布式数据库的场景下又遇到了一些新的问题。本文将会就事务故障恢复这个问题&#xff0c;分别讲述单机数据库、分布式数据库中遇到的问题和…

华为商城秒杀时加密验证 device_data 的算法研究

前言 之前华为商城放出 Mate60 手机时, 想给自己和家人抢购一两台&#xff0c;手动刷了好几天无果后&#xff0c;决定尝试编写程序&#xff0c;直接发送 POST 请求来抢。通过抓包和简单重放发送后&#xff0c;始终不成功。仔细研究&#xff0c;发现 Cookie 中有一个名为 devic…

启动gazebo harmonic

ros2 launch ros_gz_sim gz_sim.launch.py gz_version:8 如果不输入gz_version:8,默认就是6&#xff0c;启动的就是默认版本ign版本 左边那个是8&#xff0c;右边那个是6

基于EPICS modbus模块的单通道电压监测项目

先介绍在本项目中使用到的硬件&#xff1a; 1&#xff09;开发板&#xff1a;为香橙派Zero2&#xff0c;安装系统如下&#xff1a; Distributor ID: Ubuntu Description: Ubuntu 22.04.2 LTS Release: 22.04 Codename: jammy 2&#xff09; USB转485模块&…

深入探索MongoDB集群模式:从高可用复制集

MongoDB复制集概述 MongoDB复制集主要用于实现服务的高可用性&#xff0c;与Redis中的哨兵模式相似。它的核心作用是数据的备份和故障转移。 复制集的主要功能 数据复制&#xff1a;数据写入主节点&#xff08;Primary&#xff09;时&#xff0c;自动复制到一个或多个副本节…

【Java 进阶篇】Linux 常用命令使用详解:玩转命令行的魔法世界

在计算机的世界里&#xff0c;Linux是一个强大而富有魅力的操作系统。对于很多小白用户来说&#xff0c;刚接触Linux时可能感觉有些陌生&#xff0c;尤其是在命令行界面下。然而&#xff0c;正是这个看似晦涩的命令行&#xff0c;才是Linux系统最为强大和灵活的地方。本文将围绕…

论文阅读——SG-Former

SG-Former: Self-guided Transformer with Evolving Token Reallocation 1. Introduction 方法的核心是利用显著性图&#xff0c;根据每个区域的显著性重新分配tokens。显著性图是通过混合规模的自我关注来估计的&#xff0c;并在训练过程中自我进化。直观地说&#xff0c;我们…

分布式【雪花算法】

雪花算法 背景&#xff1a;在分布式系统中&#xff0c;需要使用全局唯一ID&#xff0c;期待ID能够按照时间有序生成。 **原理&#xff1a;**雪花算法是 64 位 的二进制&#xff0c;一共包含了四部分&#xff1a; 1位是符号位&#xff0c;也就是最高位&#xff0c;始终是0&am…

【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)

背景需求&#xff1a; 1、以前做单元格填充&#xff0c;都是制作N个分开的单元格 &#xff08;表格8&#xff09; 2、这次做五宫格数独的Word模板&#xff0c;我图方便&#xff0c;就只用了一个大表格&#xff0c;第六行第六列隐藏框线&#xff0c;看上去就是分开的&#xff…

Spring系列:Spring如何解决循环依赖

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

WSL使用VsCode运行cpp文件

文章目录 缘起主要步骤参考 缘起 今天在阅读《C20设计模式-可复用的面向对象设计方法&#xff08;原书第2版&#xff09;》的时候&#xff0c;遇到代码想要运行一下&#xff0c;于是决定使用wsl下的vscode配置cpp的环境。 主要步骤 1.安装gcc和g编译器 打开命令行输入wsl&am…

推荐系统中 排序策略 CTR 预估加权平均法

CTR&#xff08;Click-Through Rate&#xff09;预估加权平均法是一种用于估计广告点击率的方法&#xff0c;其中对不同的CTR预估模型赋予不同的权重&#xff0c;通过加权平均来得到整体的CTR预估。这样的方法可以充分利用多个CTR预估模型的优势&#xff0c;提高整体的预估准确…

docker应用部署(部署MySql,部署Tomcat,部署Nginx,部署Redis)

Docker 应用部署 一、部署MySQL 搜索mysql镜像 docker search mysql拉取mysql镜像 docker pull mysql:5.6创建容器&#xff0c;设置端口映射、目录映射 # 在/root目录下创建mysql目录用于存储mysql数据信息 mkdir ~/mysql cd ~/mysqldocker run -id \ -p 3307:3306 \ --na…

TCP服务器的编写(下)

我们现在开始对我们的客户端开始封装 我们的客户端&#xff0c;创建完套接字&#xff0c;需不需要bind呢&#xff1f;&#xff1f; 当然是不需要的&#xff0c;你本身是一个客户端&#xff0c;其他人写的应用也可能是客户端&#xff0c;如果我们bind&#xff0c;一定意味着我们…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴配置实现基础配置实现IGP需求&#xff1a;1. 根据拓扑所示&#xff0c;配置OSPF和EIGRP2. 在R3上增加一个网段&#xff1a;33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP&#xff0c;并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为6…

算法基础之滑雪

滑雪 核心思想&#xff1a;记忆化搜索 状态表示&#xff1a; f[i][j] 表示所有从(i,j) 开始滑的路径的最大值 状态计算&#xff1a; 分成四个方向 f[i][j] max(f[i][j] , f[i][j1] 1) 且h[a][b] (下一个点) 必须严格小于 h[i][j] 才能滑过去 #include<iostream>#…