RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想

原创 2015年11月17日 15:49:14
一、定义
    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具体有以下几条建议:
  1. 使用智能指针代替原始指针;
  2. 不直接使用mutex对象,使用guard_lock或scoped_lock替代;
  3. 对于需要回收的资源,如果没有现成的类可用,则自己封装一个管理类,在构造函数中申请资源,并析构函数中回收资源;
    
版权声明:本文为博主原创文章,如需转载,请注明出处。

相关文章推荐

Effective C++学习笔记之对RAII思想的思考

在阅读 Effective C++时,对RAII开始不理解,现总结如下: RAII是Resource acquisition is initialization的缩写形式,即“资源获取就是初始化...

C++ —— RAII编程思想

RAII则是在C++项目中用于资源管理的一种重要的编程思想。
  • noahzuo
  • noahzuo
  • 2016年04月13日 07:39
  • 705

RAII:资源获取即初始化

资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指,当你获得一个资源的时候,不管这个资源是对象、内存、文件句柄或者其它什么,你都会在一个对...

资源获取即初始化【RAII】

资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指,当你获得一个资源的时候,不管这个资源是对象、内存、文件句柄或者其它什么,你都会在一个对...

[转]RAII:资源获取即初始化

 RAII:资源获取即初始化资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指,当你获得一个资源的时候,不管这个资源是对象、内存、文件句柄...

C++必知必会 - RAII(资源获取及初始化)

RAII(资源获取及初始化),即resource acquisition is initialization;他不是某些人以为的“初始化即资源获取”(initialization is resou...
  • fishhg
  • fishhg
  • 2011年05月12日 09:19
  • 1794

RAII资源请求即初始化

维基百科:RAII RAII全称为Resource Acquisition Is Initialization,它是在一些面向对象语言中的一种惯用法。RAII源于C++,在Java,C#,D,A...

boost学习之RAII机制(资源申请即初始化)

/* 先介绍下一个专业词汇:RAII(Resource Application Immediately Initialize)资源申请即初始化。 这也是智能指针的基本原理,智能指针只是这个习语的其中...

【Spring Framework 深入】—— IoC容器初始化 -> Bean定义资源的Resource定位

IoC与容器初始化三步曲之Resource定位

platform_get_resource 如何获取资源

在platform机制下,板级文件BSP一般定义了设备的资源,在系统初始化的过程便对platform_device进行注册,接着注册platform_driver,两者都注册完毕之后哦,platfor...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
举报原因:
原因补充:

(最多只允许输入30个字)