RAIL风格

RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII早已在C++社群中深入人心。

因为系统的中的资源不是无限的,因此、通常没有使用RAIL风格的使用方式是

  1. 获取资源
  2. 使用资源
  3. 释放资源

如:

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风格相关推荐

  1. Spring Security 实战干货:路径Uri中的 Ant 风格

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | juejin.im/post/5c6b6b12 ...

  2. go语言复数包_Go语言中包的风格指南

    Go 语言也有自己的命名与代码组织规则.漂亮的代码,布局清晰.易读易懂,就像是设计严谨的 API 一样.拿到代码,用户首先看到和接触的就是布局.命名还有包的结构. 这篇文章不是为了给大家设立硬性的规定 ...

  3. eclipse maven打包jar 部分jsp无法访问_Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目...

    Maven系列教材 (九)- 在Eclipse中创建maven风格的java web项目 步骤1:删除j2ee目录步骤2:新建Maven 项目步骤3:这个界面点下一步步骤4: 这个界面使用webapp ...

  4. Android底部日期控件,Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)...

    本文Github代码链接 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDi ...

  5. powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期?

    powerbuilder的dw中使用graph风格,当横轴是日期时,如何显示才能完整显示日期? 这样日期不能放置: 使用语句: dw_1.object.gr_1.category.dispattr.f ...

  6. MQL5 中的绘图风格

    简介 MQL4 中有 6 种绘图风格.而 MQL5 中则有 18 种绘图风格.因此,可能很有必要撰写一篇文章,专门介绍 MQL5 的绘图风格. 我们会在本文研究 MQL5 中的绘图风格详情.此外,我们 ...

  7. java中REST_Java——Restful风格

    REST与RESTful: REST:表现层状态转移,资源在网络中以某种形式进行状态转移. RESTful是基于REST理念的一套开发风格,是具体的开发规则. 服务器端只返回数据,以json或者xml ...

  8. 如何在Adobe Illustrator中创建复古风格的室内场景

    创建座椅 第1步 打开Adobe Illustrator并创建一个850像素宽度和高度的新文档后,我们开始创建一把椅子. 首先,我们创建一个木制的椅子底座. 选择矩形工具(M)绘制一个长矩形.按住Sh ...

  9. 在Firefox中以电影院风格观看YouTube视频

    Do you like watching lots of videos at YouTube but are tired of the small video size and abundant ba ...

最新文章

  1. 解决:error: Cannot find libmysqlclient_r under /usr/local/mysql.
  2. XMLHTTP使用具体解释
  3. sql server 常用的扩展存储过程
  4. 高性能的序列化与反序列化:kryo的简单使用
  5. The Eclipse JDT Core jar is not in the classpath
  6. Java反射-继承关系
  7. 【论文解读】Cross-dataset Training for Class Increasing Object Detection
  8. Delphi 与 DirectX 之 DelphiX(93): TDIB.DrawDarken();
  9. 算法竞赛学习资源整理
  10. Ubuntu下Hadoop的安装和配置
  11. 网络安全问题及防护措施有哪些
  12. 谷歌SEO是什么意思,谷歌搜索引擎优化怎么做
  13. 解决Stata 15 的中文乱码问题
  14. 测试手机软件打开速度的app,16个软件打开速度测试 iPhoneXS怒胜三星Note9
  15. 计算机学院青协特色活动,计算机学院青年志愿者协会纳新活动简讯
  16. OKK集中生产加工中心(MC)的主要部品
  17. linux提示Another app is currently holding the xtables lock. Perhaps you want to use the -w option?
  18. Linux 驱动简介
  19. 【SpringBoot】之自定义 Filter 过滤器
  20. 主机名以及内外部命令

热门文章

  1. 用twisted为未来安排任务(Scheduling tasks for the future
  2. PVLAN技术应用,网络管理员的新宠
  3. poj 2346(DP)
  4. 北风设计模式课程---13、享元模式
  5. [Swift]LeetCode210. 课程表 II | Course Schedule II
  6. 详解django三种文件下载方式
  7. android 录屏
  8. DirectX11 初探XMVECOTRXMMATRIX
  9. mysql半同步复制
  10. 转;VC++中Format函数详解