什么是RAII?

RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源

为什么要使用RAII?

上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程序了,口头上经常会说资源,那么资源是如何定义的?在计算机系统中,资源是数量有限且对系统正常运行具有一定作用的元素。比如:网络套接字、互斥锁、文件句柄和内存等等,它们属于系统资源。由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭的,所以,我们在编程使用系统资源时,都必须遵循一个步骤:
  • 1 申请资源;
  • 2 使用资源;
  • 3 释放资源。
第一步和第二步缺一不可,因为资源必须要申请才能使用的,使用完成以后,必须要释放,如果不释放的话,就会造成资源泄漏

一个最简单的例子:

#include <iostream> using namespace std; int main() { int *testArray = new int [10]; // Here, you can use the array delete [] testArray; testArray = NULL ; return 0;
}

小结:

但是如果程序很复杂的时候,需要为所有的new 分配的内存delete掉,导致极度臃肿,效率下降,更可怕的是,程序的可理解性和可维护性明显降低了,当操作增多时,处理资源释放的代码就会越来越多,越来越乱。如果某一个操作发生了异常而导致释放资源的语句没有被调用,怎么办?这个时候,RAII机制就可以派上用场了。

如何使用RAII?

当我们在一个函数内部使用局部变量,当退出了这个局部变量的作用域时,这个变量也就别销毁了;当这个变量是类对象时,这个时候,就会自动调用这个类的析构函数,而这一切都是自动发生的,不要程序员显示的去调用完成。这个也太好了,RAII就是这样去完成的。

由于系统的资源不具有自动释放的功能,而C++中的类具有自动调用析构函数的功能。如果把资源用类进行封装起来,对资源操作都封装在类的内部,在析构函数中进行释放资源。当定义的局部变量的生命结束时,它的析构函数就会自动的被调用,如此,就不用程序员显示的去调用释放资源的操作了。

使用RAII 机制的代码:

#include <iostream>
using namespace std; class ArrayOperation
{
public : ArrayOperation() { m_Array = new int [10]; } void InitArray() { for (int i = 0; i < 10; ++i) { *(m_Array + i) = i; } } void ShowArray() { for (int i = 0; i <10; ++i) { cout<<m_Array[i]<<endl; } } ~ArrayOperation() { cout<< "~ArrayOperation is called" <<endl; if (m_Array != NULL ) { delete[] m_Array;  // 非常感谢益可达非常犀利的review,详细可以参加益可达在本文的评论 2014.04.13m_Array = NULL ; } } private : int *m_Array;
}; bool OperationA();
bool OperationB(); int main()
{ ArrayOperation arrayOp; arrayOp.InitArray(); arrayOp.ShowArray(); return 0;
}
上述的两个例子都是RAII机制的应用,理解了上面的例子,就应该能理解了RAII机制的使用了。

C++中的RAII机制相关推荐

  1. 【C++设计技巧】C++中的RAII机制

    随笔- 427  文章- 0  评论- 4 作者:gnuhpc  出处:http://www.cnblogs.com/gnuhpc/ 1.概念 Resource Acquisition Is Init ...

  2. C++RAII机制(智能指针原理)

    原文详细整理 C++中的RAII机制 - 码到城攻RAII机制,是C++语言的一种管理资源.避免泄漏的惯用法https://www.codecomeon.com/posts/200/ 何为RAII R ...

  3. C++之RAII机制

    1.什么是RAII? RAII(Resource Acquisition Is Initialization)机制是Bjarne Stroustrup首先提出的,也称直译为"资源获取就是初始 ...

  4. C 多线程的互斥锁应用RAII机制

    什么是RAII机制 RAII是Resource Acquisition Is Initialization(翻译成 "资源获取即初始化")的简称,是C 语言的一种管理资源.避免资源 ...

  5. C++程序设计机制:RAII机制

    1.背景 C/C++程序开发中,管理堆上分配的内存容易出错,常见的就是内存泄漏.原则上,只要我们足够仔细,在每一次动态分配内存之后,使用完毕后,手动delete即可释放掉内存,可是这必然会加大我们的工 ...

  6. RAII机制原理分析

    本文转载自: https://blog.csdn.net/wozhengtao/article/details/52187484 前言 RAII的基本思想就是当对象的生命周期结束时,自动调用起析构函数 ...

  7. C++ RAII机制

    最近一直在碰到这个RAII机制,但是似乎没搞清楚这啥意思.现在大概明白了,C++的RAII机制就是类似于C#或者Java的GC机制,垃圾回收.合理的回收系统资源,避免程序员大量的写重复的delete代 ...

  8. C++——RAII机制

    文章目录 我们知道,资源的使用一般经历三个步骤 a.获取资源 b.使用资源 c.销毁资源 资源的销毁往往是程序员经常忘记的一个环节,忘记销毁资源可能会造成内存泄露,怎么解决呢?--RAII RAII: ...

  9. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

最新文章

  1. __name__ ==“ __main__”怎么办?
  2. 图像处理中ct图的通道是多少_常见医疗扫描图像处理步骤
  3. kaggle删除自己的数据集
  4. 他们和机器人啪啪啪,并计划共度一生
  5. unity3d模拟树叶飘动_Unity3D独立游戏开发日记(一):动态生成树木
  6. C#LeetCode刷题之#202-快乐数(Happy Number)
  7. 2019年,我们需要加强关注网络安全的6大原因
  8. Python学习之路--Day5
  9. magento 模板区块--商品总类别显示页
  10. 定制C/C++缩进风格
  11. SpringAOP之@EnableAspectJAutoProxy如何实现自动代理?
  12. protoc安装使用
  13. 完成知乎项目的登录和注册功能(一)
  14. 【工具篇】Unity使用Spine2D动画,代码控制
  15. 把EXCEL拆分成两个窗口的办法
  16. 已有多项研究表明手机致癌,这12张图告诉你,如何摆脱手机上瘾!
  17. 辨别 利用AAC转成无损格式音乐 的假无损
  18. [Unity]VRTK V4的导入和使用
  19. 去天瑞地安面试了 这是我整个的面试流程
  20. Prometheus时序数据库-报警的计算 及 Prometheus时序数据库-数据的查询

热门文章

  1. 阿里HBase的数据管道设施实践与演进
  2. MongoDB基础教程系列--目录结构
  3. Ubuntu 16.04下用Wine运行的软件出现方块的解决思路(应该是兼容现在所有平台的Wine碰到这个的问题)...
  4. VMware Horizon虚拟桌面工具箱之审计与远程协助
  5. 解决IOS微信中 HTML5 中audio的自动播放问题。
  6. Missing artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0
  7. Hibernate介绍
  8. 算法提高课-搜索-最小步数模型-AcWing 1107. 魔板:bfs、复杂、八数码类似的题目
  9. Mysql可视化工具Navicat中文版下载和报错解决
  10. BFS最短路打印路径