C++中的RAIL风格
RAIL
风格
RAII
是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII
早已在C++社群中深入人心。
因为系统的中的资源不是无限的,因此、通常没有使用RAIL
风格的使用方式是
- 获取资源
- 使用资源
- 释放资源
如:
void fileHandler() {FILE * f = fopen("test.txt", "rw");someFunction();fclose(f);
}
但是资源过多的时候就会出现漏释放的情况导致资源泄露,RAIL
的使用方式在C++
中随处可见,比如标准库中的lock_guard<std::mutex>
的实现。
因为,锁的特殊性。锁的申请没有放到lock_guard
中实现,但是锁的加锁和锁的释放是采用了RAIL
的模式。
/** @brief A simple scoped lock type.** A lock_guard controls mutex ownership within a scope, releasing* ownership in the destructor.
*/
template<typename _Mutex>
class lock_guard
{public:typedef _Mutex mutex_type;// 在构造函数中加锁explicit lock_guard(mutex_type& __m) : _M_device(__m){ _M_device.lock(); }lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m){ } // calling thread owns mutex// 析构函数中释放锁~lock_guard(){ _M_device.unlock(); }// 拒绝隐式转换lock_guard(const lock_guard&) = delete;lock_guard& operator=(const lock_guard&) = delete;private:mutex_type& _M_device;
};
关注公众号,一起学习C/C++/go的最新技术
C++中的RAIL风格相关推荐
- Spring Security 实战干货:路径Uri中的 Ant 风格
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | juejin.im/post/5c6b6b12 ...
- go语言复数包_Go语言中包的风格指南
Go 语言也有自己的命名与代码组织规则.漂亮的代码,布局清晰.易读易懂,就像是设计严谨的 API 一样.拿到代码,用户首先看到和接触的就是布局.命名还有包的结构. 这篇文章不是为了给大家设立硬性的规定 ...
- eclipse maven打包jar 部分jsp无法访问_Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目...
Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目 步骤1:删除j2ee目录步骤2:新建Maven 项目步骤3:这个界面点下一步步骤4: 这个界面使用webapp ...
- Android底部日期控件,Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)...
本文Github代码链接 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDi ...
- powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期?
powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期? 这样日期不能放置: 使用语句: dw_1.object.gr_1.category.dispattr.f ...
- MQL5 中的绘图风格
简介 MQL4 中有 6 种绘图风格.而 MQL5 中则有 18 种绘图风格.因此,可能很有必要撰写一篇文章,专门介绍 MQL5 的绘图风格. 我们会在本文研究 MQL5 中的绘图风格详情.此外,我们 ...
- java中REST_Java——Restful风格
REST与RESTful: REST:表现层状态转移,资源在网络中以某种形式进行状态转移. RESTful是基于REST理念的一套开发风格,是具体的开发规则. 服务器端只返回数据,以json或者xml ...
- 如何在Adobe Illustrator中创建复古风格的室内场景
创建座椅 第1步 打开Adobe Illustrator并创建一个850像素宽度和高度的新文档后,我们开始创建一把椅子. 首先,我们创建一个木制的椅子底座. 选择矩形工具(M)绘制一个长矩形.按住Sh ...
- 在Firefox中以电影院风格观看YouTube视频
Do you like watching lots of videos at YouTube but are tired of the small video size and abundant ba ...
最新文章
- 解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.
- XMLHTTP使用具体解释
- sql server 常用的扩展存储过程
- 高性能的序列化与反序列化:kryo的简单使用
- The Eclipse JDT Core jar is not in the classpath
- Java反射-继承关系
- 【论文解读】Cross-dataset Training for Class Increasing Object Detection
- Delphi 与 DirectX 之 DelphiX(93): TDIB.DrawDarken();
- 算法竞赛学习资源整理
- Ubuntu下Hadoop的安装和配置
- 网络安全问题及防护措施有哪些
- 谷歌SEO是什么意思,谷歌搜索引擎优化怎么做
- 解决Stata 15 的中文乱码问题
- 测试手机软件打开速度的app,16个软件打开速度测试 iPhoneXS怒胜三星Note9
- 计算机学院青协特色活动,计算机学院青年志愿者协会纳新活动简讯
- OKK集中生产加工中心(MC)的主要部品
- linux提示Another app is currently holding the xtables lock. Perhaps you want to use the -w option?
- Linux 驱动简介
- 【SpringBoot】之自定义 Filter 过滤器
- 主机名以及内外部命令