RAII资源管理理解

基础介绍

RAII (Resource Acquisition Is Initialization) 是一种 C++ 编程范式,这不是一个语法特性,而是一种处理方式。RAII的思想:

  1. 资源获取与对象初始化同时发生
  2. 资源释放与对象销毁同时发生
  3. 通过对象的生命周期来管理资源,确保资源的安全使用

怎么理解RAII呢?前面说了这不是一种库特性,更像是一种约定,一种管理资源的方式,c++标准库某些库特性提供了RAII资源给管理的特性,用户自己设计的类型也可以按照RAII的思想进行设计。

RAII特点

自动资源管理

这是一个核心的特点,核心就是资源管理,要确保资源的获取和销毁与对象的生命周期一致。通过这个特点可以实现资源的自动清理,防止资源泄露。请看下面的例子:

class FileHandler
{private:FILE* file;public: //构造函数获取资源FileHandler(char* filename){    file = fopen(filename, "r");if(!file) throw std::runtime_error("failed to open file");}//析构函数释放资源~FileHandler(){if(file)fclose(file);}};

异常安全

void processFile() {FileHandler fh("data.txt");  // 获取资源// 如果这里抛出异常,FileHandler的析构函数仍会被调用// 确保文件被正确关闭doSomething();
} // 作用域结束,自动调用析构函数释放资源

常见的RAII应用场景

智能指针

智能指针std::unique_ptr<T>在实现中就采用了RAII的变成范式,当创建这个指针被构造函数构造时,就会获取资源,当std::unique_ptr<T>变量声明周期结束时,就会自动释放该指针对应的对象。注意std::shared_ptr<T>变量不时RAII的思想,这种类型的变量是需要根据引用计数的数量来决定资源是否释放。示例如下所示:

class Resource {
public:void doWork() { /* ... */ }
};void foo() {std::unique_ptr<Resource> ptr(new Resource()); // RAII管理动态内存ptr->doWork();// 不需要手动删除,unique_ptr析构时会自动删除
}

互斥锁的管理

class Lock
{private:std::mutex& mtx;public:Lock(std::mutex& m):mtx(m){mtx.lock();  //构造时加锁}~Lock(){mtx.unlock();  //析构时解锁}
};void funtion()
{std::mutex mtx;Lock lock(mtx);   //此处加锁.....
}//函数结束自定解锁

数据库连接

class DBConnection {
private:Connection* conn;
public:DBConnection(const std::string& connectionString) {conn = DatabaseConnect(connectionString);if (!conn) throw std::runtime_error("Connection failed");}~DBConnection() {if (conn) {DatabaseDisconnect(conn);}}
};

优秀实践

不要使用裸指针

这里不使用裸指针的意思是,如果使用裸指针就需要自己管理这个裸指针的释放,如有可能尽可能使用一些智能指针,比如std::unique_ptr<T>,也可以使用std::shared_ptr<T>。请看下面的 例子:

Resource* source = new Resource();
.......  //业务逻辑
delete source;   //手动释放资源std::unique_ptr<Resource> res = std::make_unique<Resource>();//生命周期结束自动结束

使用标准的RAII工具

  1. 智能指针:std::unique_ptr std::shared_ptr std::weak_ptr
  2. 互斥锁和线程同步:std::lock_guard<T> std::unique_lock std::scoped_lock std::shared_lock
  3. 标准容器:所有的标准容器都是RAII的,如set map vecotor等

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

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

相关文章

解锁元生代:ComfyUI工作流与云原生后端的深度融合

目录 蓝耘元生代&#xff1a;智算新势力崛起​ ComfyUI 工作流创建详解​ ComfyUI 初印象​ 蓝耘平台上搭建 ComfyUI 工作流​ 构建基础工作流实操​ 代码示例与原理剖析​ 云原生后端技术全景 云原生后端概念解析​ 核心技术深度解读​ 蓝耘元生代中两者的紧密联系​…

实战篇|多总线网关搭建与量产验证(5000 字深度指南)

引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…

Kafka安全认证技术:SASL/SCRAM-ACL方案详解

#作者 &#xff1a;张桐瑞 文章目录 1Kafka安全认证技术介绍2基础设置3 配置SASL/SCRAM认证3.1编写server.properties配置3.2编写kafka.conf密码文件3.3编写user.properties配置文件3.4编写kafka-run-class.sh脚本文件3.5Zk中增加kafka用户3.6启动kafka进程 1Kafka安全认证技术…

TCP/IP和UDP协议的发展历程

TCP/IP和UDP协议的发展历程 引言 互联网的发展史是人类技术创新的辉煌篇章&#xff0c;而在这一发展过程中&#xff0c;通信协议发挥了奠基性的作用。TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;作为互联网通信的基础…

PhotoShop学习10

1.画板功能的使用 使用画板功能可以轻松针对不同的设备和屏幕尺寸设计网页和 APP。画板是一种容器&#xff0c;类似于特殊图层组。画板中的图层在图层面板中&#xff0c;按画板进行分组。 使用画板&#xff0c;一个文档中可以有多个设计版面&#xff0c;这样可以在画板之间轻…

X-AnyLabeling开源程序借助 Segment Anything 和其他出色模型的 AI 支持轻松进行数据标记。

一、软件介绍 文末提供源码和程序下载学习 使用 X-AnyLabeling开源程序可以 导入、管理和保存数据。用户可以通过多种方式导入图像和视频文件&#xff0c;包括快捷方式或菜单选项。此外&#xff0c;它还涵盖数据删除、图像切换以及标签和图像数据的保存&#xff0c;以确保高效…

【深度解析】PlatformIO多环境配置实践:ESP32/ESP32-S3/ESP32-C3适配指南

一、前言&#xff1a;为什么需要多环境配置&#xff1f; 在物联网开发中&#xff0c;我们经常需要适配不同型号的硬件平台&#xff08;如ESP32系列&#xff09;,并且github上多数关于ESP32的都适配了多种开发板。传统开发方式需要为每个平台维护独立项目&#xff0c;而Platfor…

React 列表渲染基础示例

React 中最常见的一个需求就是「把一组数据渲染成一组 DOM 元素」&#xff0c;比如一个列表。下面是我写的一个最小示例&#xff0c;目的是搞清楚它到底是怎么工作的。 示例代码 // 定义一个静态数组&#xff0c;模拟后续要渲染的数据源 // 每个对象代表一个前端框架&#xf…

NHANES指标推荐:CMI

文章题目&#xff1a;Association between cardiometabolic index and biological ageing among adults: a population-based study DOI&#xff1a;10.1186/s12889-025-22053-3 中文标题&#xff1a;成年人心脏代谢指数与生物衰老之间的关系&#xff1a;一项基于人群的研究 发…

QT调用ffmpeg库实现视频录制

可以通过QProcess调用ffmpeg命令行,也可以直接调用ffmpeg库,方便。 调用库 安装ffmpeg ffmpeg -version 没装就装 sudo apt-get update sudo apt-get install ffmpeg sudo apt-get install ffmpeg libavdevice-dev .pro引入库路径,引入库 LIBS += -L/usr/lib/aarch64-l…

消息中间件——RocketMQ(二)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 RocketMQ&#xff08;一&#xff09; 接上期内容&#xff1a;上期完成了RocketMQ单机部署知识。下面学习RocketMQ集群相关知识&#xf…

pyqt环境配置

文章目录 1 概述2 PyQt6和PySide6区别3 环境配置4 配置PySide65 配置PyQt66 配置外部工具7 添加模板8 使用pyside6-project构建工程9 常见错误10 相关地址 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1…

金融数据库转型实战读后感

荣幸收到老友太保科技有限公司数智研究院首席专家林春的签名赠书。 这是国内第一本关于OceanBase数据库实际替换过程总结的的实战书。打个比方可以说是从战场上下来分享战斗经验。读后感受颇深。我在这里讲讲我的感受。 第三章中提到的应用改造如何降本。应用改造是国产化替换…

旅游资源网站登录(jsp+ssm+mysql5.x)

旅游资源网站登录(jspssmmysql5.x) 旅游资源网站是一个为旅游爱好者提供全面服务的平台。网站登录界面简洁明了&#xff0c;用户可以选择以管理员或普通用户身份登录。成功登录后&#xff0c;用户可以访问个人中心&#xff0c;进行修改密码和个人信息管理。用户管理模块允许管…

STM32 HAL库之WDG示例代码

独立看门狗&#xff08;IWDG&#xff09; 在规定时间内按按键喂狗并将LED关闭&#xff0c;若产生看门狗复位则LED打开 初始化独立看门狗&#xff0c;在main.c中的 MX_IWDG_Init();&#xff0c;也就是iwdg.c中的初始化代码 void MX_IWDG_Init(void) {/* USER CODE BEGIN IWDG…

【第47节】windows程序的其他反调试手段下篇

目录 一、利用Hardware Breakpoints Detection 二、PatchingDetection - CodeChecksumCalculation 补丁检测&#xff0c;代码检验和 三、block input 封锁键盘、鼠标输入 四、使用EnableWindow 禁用窗口 五、利用ThreadHideFromDebugger 六、使用Disabling Breakpoints 禁…

【笔记ing】AI大模型-03深度学习基础理论

神经网络&#xff1a;A neural network is a network or circuit of neurons,or in a modern sense,an artificial neural network,composed of artificial neurons or nodes.神经网络是神经元的网络或回路&#xff0c;或者在现在意义上来说&#xff0c;是一个由人工神经元或节…

基于Djiango实现中药材数据分析与可视化系统

中药材数据分析与可视化系统 项目截图 登录 注册 首页 药材Top20 药材价格 产地占比 历史价格 新闻资讯 后台管理 一、项目概述 中药材数据分析与可视化系统是一个基于Django框架开发的专业Web应用&#xff0c;致力于对各类中药材数据进行全面、系统的采集、分析和可视化展示…

【AI飞】AutoIT入门七(实战):python操控autoit解决csf视频批量转换(有点难,AI都不会)

背景&#xff1a; 终极目标&#xff1a;通过python调用大模型&#xff0c;获得结果&#xff0c;然后根据返回信息&#xff0c;控制AutoIT操作电脑软件&#xff0c;执行具体工作。让AI更具有执行力。 已完成部分&#xff1a; 关于python调用大模型的&#xff0c;可以参考之前的…

leetcode 188. Best Time to Buy and Sell Stock IV

目录 题目描述 第一步&#xff0c;明确并理解dp数组及下标的含义 第二步&#xff0c;分析明确并理解递推公式 1.求dp[i][j].holding 2.求dp[i][j].sold 第三步&#xff0c;理解dp数组如何初始化 第四步&#xff0c;理解遍历顺序 代码 题目描述 这道题把第123题推广为一…