RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
来源:互联网 发布:淘宝怎么进体检中心 编辑:程序博客网 时间:2024/06/04 18:09
一、定义
RAII,Resouce Acquisition Is Initialization,翻译成中文的意思就是资源获取即初始化,RAII主要用于保证申请的资源得到正确的释放。最初由Bjarne Stroustrup提出,为了保证资源能够正确的得到释放,RAII原则是所有的资源都必须有管理对象,而资源的申请操作在管理对象的构造函数中进行,而资源的回收则在管理对象的析构函数中进行。由于C++标准保证所有对象在离开作用域时,析构函数都会被调用,因此即使在资源的使用过程中发生了异常,也能够保证资源得到释放。
二、标准C++中RAII
在标准C++中,有很多地方都遵守了RAII原则,比如ifstream和ofstream。当我们使用按如下使用文件时:
{
ifstream fin("test.txt", ios::in);
... //do some work
}
在fin离开其作用域时,在它的析构函数中会调用fin的close方法,以关闭打开的文件句柄,这里文件句柄的获取即是ifstream对象的初始化,ifstream也就成为了文件句柄的管理类,在它的构造函数中会负责句柄的回收。假如此处使用的是FILE*,而且在离开作用域之前没有主动关闭文件句柄,或者是在关闭之前发生了异常,则文件句柄得不到释放。
除此以外还有智能指针,如unique_ptr,shared_ptr等,它们是典型的RAII原则。它们负责对创建于堆内存的对象进行管理,在析构函数中会负责对象所占内存的回收。如果是unique_ptr,在析构函数中会直接调用delete来回收对象内存;而shared_ptr则在析构函数中,先减引用计数,如果引用计数值为0,则调用delete回收内存,否则不做其他操作。
三、遵守RAII的建议
关于RAII具体有以下几条建议:
- 使用智能指针代替原始指针;
- 不直接使用mutex对象,使用guard_lock或scoped_lock替代;
- 对于需要回收的资源,如果没有现成的类可用,则自己封装一个管理类,在构造函数中申请资源,并析构函数中回收资源;
0 0
- RAII(Resource Acquisition Is Initialization:资源获取即初始化)
- RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
- 浅谈----RAII资源获得即初始化(Resource Acquisition Is Initialization)
- RAII:资源获取即初始化(resourse acquisition is initialization)
- Resource Acquisition Is Initialization(RAII)
- RAII -- Resource Acquisition Is Initialization
- Resource Acquisition Is Initialization(RAII Idiom)
- Resource Acquisition Is Initialization (RAII)是什么?(封装的优势)
- The RAII(resource acquisition is initialization) of C++
- RAII:资源获取即初始化
- RAII:资源获取即初始化
- 资源获取即初始化【RAII】
- RAII技术--获取资源即初始化
- [转]RAII:资源获取即初始化
- RAII(资源获取即初始化)详解
- RAII (Resource Acquirement Is Initialization)
- RAII资源请求即初始化
- Applicable Resource Allocation Is Initialization(RAII)
- xml基础知识总结
- MAC搭建 PHP 环境
- RxJava 操作符整理 收集
- 黑马程序员——IO(二)
- c++ list, vector, map, set 区别与用法比较
- RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
- Android iOS 跳转到qq聊天页面
- android 关于Toast重复显示解决方法
- windows下蓝牙虚拟串口通信
- iOS下的后台任务实现方法
- @property修饰符
- Deep learning:Dropout简单理解
- matlab控制摄像头
- compiler之automatic memory management以及Java GC