`
yesjavame
  • 浏览: 691183 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

RAII:资源获取即初始化

 
阅读更多

摘自《Extended STL》中译


RAII:资源获取即初始化

资源获取即初始化(RAII, Resource Acquisition Is Initialization)是指,当你获得一个资源的时候,不管这个资源是对象、内存、文件句柄或者其它什么,你都会在一个对象的构造函数中获得它,并且在该对象的析构函数中释放它。实现这种功能的类,我们就说它采用了"资源获取即初始化(RAII)"的方式。这样的类常常被称为封装类。

可以依据资源可变性和资源来源这两个特征,来对RAII进行分类。


资源可变性

如果一个封装类对其实例提供额外的功能,使得其实例能被赋予新资源,这个类表现出的这种特征即称为"可变的RAII",否则就是"不可变的RAII"。

不可变的RAII,是使用起来最简单的一种。说它简单,是因为在这种情况下,无需在封装类中提供用于指定资源的方法--不管是新分配的资源,还是对其他资源进行拷贝。这种RAII还意味着,类的析构函数总是可以假定,被封装的资源是有效的。

与此相反,提供可变的RAII的类,就需要实现下列功能中的绝大部分,或者全部:缺省的或者空的构造函数,拷贝构造函数,拷贝赋值操作,用于指定资源的方法。最重要的是,这样的类在析构函数和任何类似close()的方法中,释放资源前,都必须检测被封装的资源是不是null。


资源来源

对于提供RAII的类来说,第二个重要的特征是,它们通过什么途径获取自己所管理的资源。以std::string为代表的类,使用的是内部初始化的RAII:它管理的资源--即内存中用于保存字符的缓冲区--是由它自己创建的,这一资源对外永远是不可见的。与此不同的是,以std::auto_ptr为代表的类表现出外部初始化的RAII行为:它所管理的资源,是使用它的客户程序(通过另外的某种方式获得之后)交给它的。

内部初始化的RAII的封装类,一般比较容易实现,但是功能上也比较受限制,因为它们获取资源的机制是预先定义好的,并且是固定不变的。不过,这样的类用起来也容易一些,或者说,比较难被误用:因为客户代码几乎没有机会犯下能导致资源泄露的错误。


(转载请注明来源于金庆的专栏)

分享到:
评论

相关推荐

    C++ 中的 RAII(资源获取即初始化)是什么

    在C++中,RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种管理资源的编程技术,它通过将资源的生命周期绑定到对象的生命周期来确保资源的正确获取和释放。这种技术利用了C++的构造函数和...

    RAII.scala:资源获取正在初始化

    区别在于Do中的资源可以在范围内自动获取/释放,也可以通过引用计数机制进行管理。 要使用Do ,请将以下设置添加到您的build.sbt中, libraryDependencies + = " com.thoughtworks.raii " %% " asynchronous " % ...

    swiftzmq:使用优秀的 czmq 库为 Swift 提供干净、安全、编写良好的 ZeroMQ (zmq) 绑定

    RAII:资源获取即初始化。 或者把过程包裹起来达到同样的效果 在析构函数中清理自己 关于管理内存的“做正确的事” 倾向于使用协议进行横向组合而不是继承 把事情简单化 尽量不要弄得一团糟:) 版权和许可 ...

    raii.js:基于ES6 Promise的RAII堆栈工具

    RAII.js介绍RAII.js是基于ES6 Promise的RAII(资源获取即初始化)实现。 RAII.js确保您的资源按顺序进行了初始化和销毁​​,并且可以随时取消(销毁)整个堆栈。安装只需通过npm在项目中安装raii.js即可: npm ...

    mmap-RAII:我的GitHub个人资料的配置文件

    标题 "mmap-RAII:我的GitHub个人资料的配置文件" 暗示了这是一个关于使用C++编程语言实现的内存映射(mmap)和资源获取即初始化(RAII)技术来管理GitHub配置文件的项目。在这个项目中,开发者@nikki-dong可能创建了...

    C++专业考试题集与详解

    内容概要:本文提供了C++专业考试的选择题、简答题及编程题,涵盖常用关键字识别、动态内存分配操作符识别、拷贝构造函数的理解,探讨了虚函数的作用、阐述了RAII(资源获取即初始化)的概念,并展示了Circle及...

    深度学习面试题1.docx

    解释RAII(资源获取即初始化)的概念。 RAII是一种管理资源的编程技术。资源在对象的生命周期内被获取(通常是在构造函数中),并在对象销毁时自动释放(通常是在析构函数中)。这确保了资源的正确管理,防止了资源...

    C++面试试题3.docx

    答案: RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种C++编程技术,它将资源的管理(如内存、文件句柄、网络连接等)与对象的生命周期绑定在一起。在构造函数中获取资源,在析构函数中...

    my_simple_RAII

    RAII(Resource Acquisition Is Initialization,资源获取即初始化)是C++编程中一种重要的资源管理策略,它通过对象生命周期来管理资源,确保资源在创建时被正确获取,并在不再需要时自动释放。在本文中,我们将以...

    c++之第四初始化与清除

    第四初始化,通常指的是在对象创建过程中的第四种初始化方式,而清除则涉及到对象使用完毕后的资源释放。以下是对这两个概念的详细阐述。 首先,让我们探讨C++中的初始化。初始化在C++中是一个至关重要的步骤,因为...

    fileraii.h

    资源获取即初始化:文件的RAII实现,简单实现了打开、写操作,可以自行添加其他功能...

    C++箴言:资源管理类的拷贝行为

    资源管理类是遵循资源获取即初始化(Resource Acquisition Is Initialization, RAII)原则的一种特殊类型的数据结构。这类数据结构通过其构造函数获取资源,并在析构函数中自动释放资源,从而有效避免了资源泄漏的问题...

    C++多核高级编程中文高清版.zip

    4. **RAII(资源获取即初始化)**:RAII是一种编程范式,通过对象的生命周期来管理资源,确保在对象消亡时释放资源。在多线程环境中,这有助于避免资源竞争和死锁。 5. **并发与并行**:C++11及后续版本提供了`std:...

    2. RAII与智能指针1

    RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种C++编程中的概念,它通过对象的生命周期来管理资源,确保资源在不再需要时能够正确释放。这种策略特别适用于处理动态分配的内存,防止因...

    使用RAII技术简化代码耗时统计源码

    RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种编程技术,主要应用于C++语言,其核心思想是在对象创建时获取资源,并在对象销毁时自动释放资源。这种技术有效地利用了C++的构造函数和析构...

    VC++ 2005系列课程(4):确定性资源清理

    RAII(资源获取即初始化)是C++中的一种编程策略,它提倡在对象构造时获取资源,并在对象析构时自动释放资源。这样可以确保即使在异常情况下,资源也能被正确清理。例如,使用`std::fstream`处理文件时,文件会在流...

    <<More Effective C++>>

    使用异常处理策略,如异常不变量、资源获取即初始化(RAII)和异常安全函数,可以提高程序的鲁棒性。 4. **RAII**:资源获取即初始化是一种C++设计模式,它确保资源(如内存、文件句柄等)在对象构造时获取并在析构...

    more effectiveC++

    可以采用异常安全的编程技术,如资源获取即初始化(RAII)和异常安全的函数保障级别。 8. **理解动态内存管理**:C++的动态内存管理要求程序员手动管理内存,这可能导致内存泄漏和悬挂指针。理解何时使用`new`和`...

    c++文档(包含c11汉化版本和英文版本)

    13. **智能指针(Smart Pointers)**:如`std::unique_ptr`、`std::shared_ptr`和`std::weak_ptr`,为内存管理提供了RAII(资源获取即初始化)机制。 这些文档的中文版对于中文使用者来说是非常宝贵的资源,可以...

Global site tag (gtag.js) - Google Analytics