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. 对于需要回收的资源,如果没有现成的类可用,则自己封装一个管理类,在构造函数中申请资源,并析构函数中回收资源;
    
版权声明:本文为博主原创文章,如需转载,请注明出处。

C++11资源管理新方法ON_SCOPE_EXIT

先来看一下背景:在C++98的语言机制中,对象在超出作用域的时候其析构函数会被自动调用。接着,Bjarne Stroustrup在TC++PL里面定义了RAII(Resource Acquisitio...
  • q5339621
  • q5339621
  • 2016年10月27日 11:20
  • 576

智能指针从auto_ptr说起

从何说起,从”auto_ptr”说起 那还是在上大学的时候,看了《C++标准程序库:自修教程与参考手册》,看到auto_ptr这个东西;哎呦,不错,是个好东西,然后看了看;还记得,参加亚信联创的招聘...
  • liujiayu2
  • liujiayu2
  • 2015年10月19日 16:17
  • 467

浅谈----RAII资源获得即初始化(Resource Acquisition Is Initialization)

今天看到RAII(Resource Acquisition Is Initialization,即资源获得即初始化)的时候,脑子里竟然想不出它的意思。 其实这个词自己应该是很熟悉了的,在Excepti...
  • u014316901
  • u014316901
  • 2015年06月12日 17:35
  • 536

RAII -- Resource Acquisition Is Initialization

 RAII,资源获取即初始化。这个东西本不是什么高深的东西,日常写代码时也经常用到,其实就是将资源与对象的生命周期绑定,具体的做法就是在构造函数中初始话资源,在析构函数中释放资源,这样使用这个对象的时...
  • yacper
  • yacper
  • 2009年11月06日 16:59
  • 576

VC++常见BUG防范与解决方法

C++语言是桌面系统,尤其是系统软件、大型应用软件的主流开发语言。C++语言以其灵活性著称,同时也更复杂。利用C++编写健壮的代码,更具有挑战性。C++允许动态内存管理,同时也容易导致更多和内存相关的...
  • brk1985
  • brk1985
  • 2014年05月19日 10:17
  • 882

C++之RAII惯用法

转载地址:http://blog.csdn.net/hunter8777/article/details/6327704 C++中的RAII全称是“Resource acquisition is...
  • u012398613
  • u012398613
  • 2016年05月14日 21:57
  • 182

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

1.裸指针,操作不当导致,空悬指针(指针所指向的资源已经被释放,但是指针未置空),内存泄漏,重复释放 2.栈展开的过程中不会自动释放 3.应用RAII技巧,将裸指针换为智能指针(是一个类),将指针转为...
  • INGNIGHT
  • INGNIGHT
  • 2017年05月18日 17:02
  • 347

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

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

摘录的一些Bjarne Stroustrup关于C++的谈话内容

1 专访 Bjarne Stroustrup2 C++ 热点问题一席谈3 C++0x 热点问题访谈4 C++0x 概览 专访 Bjarne Stroust...
  • snailjava
  • snailjava
  • 2007年06月10日 12:21
  • 5146

浅析 C++ 之 RAII

浅析 C++ 之 RAII 1.什么是RAII 技术?(参见百度百科相关条目)       RAII(Resource Acquisition Is Initialization)是一种利...
  • suelog
  • suelog
  • 2014年08月19日 18:43
  • 216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RAII(Resource Acquisition Is Initialization资源获取即初始化 )思想
举报原因:
原因补充:

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