C++中的RAII

C++中的RAII有很多东西我们一直在用 但是不知道他的名字 什么是 RAII RAII 是 ResourceAcqu 的缩写 用普通话将就是 资源获取即初始化 为什么需要 RAII 看一段代码 RawResourceH handle createNewRes handle performInval 发生异常

有很多东西我们一直在用,但是不知道他的名字。

什么是RAII?

RAII是Resource Acquisition Is Initialization的缩写,用普通话将就是”资源获取即初始化”

为什么需要RAII?

看一段代码:

RawResourceHandle* handle=createNewResource(); handle->performInvalidOperation(); // 发生异常 ... deleteResource(handle); // 永远不会释放

如何使用RAII?

最简单的说,就是进行一个简单的封装:

class ManagedResourceHandle { public: ManagedResourceHandle(RawResourceHandle* rawHandle_) : rawHandle(rawHandle_) {}; ~ManagedResourceHandle() {delete rawHandle; } private: RawResourceHandle* rawHandle; }; ManagedResourceHandle handle(createNewResource()); handle->performInvalidOperation();

有了上面代码中的封装,就不需要担心产生异常了。

步骤:
1 Encapsulate a resource into a class

2 Use the resource via a local instance of the class*

3 The resource is automatically freed when the object gets out of scope

RAII与C++11

写一个write to file的函数:

#include 
    #include 
    #include 
    
    #include 
    #include 
    void write_to_file (const std::string & message) { // mutex to protect file access (shared across threads) static std::mutex mutex; // lock mutex before accessing file std::lock_guard<std::mutex> lock(mutex); // try to open file std::ofstream file("example.txt"); if (!file.is_open()) throw std::runtime_error("unable to open file"); // write message to file file << message << std::endl; // file will be closed 1st when leaving scope (regardless of exception) // mutex will be unlocked 2nd (from lock destructor) when leaving // scope (regardless of exception) }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220430.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午8:30
下一篇 2026年3月17日 下午8:30


相关推荐

  • 写一段代码在遍历 ArrayList 时移除一个元素?

    写一段代码在遍历 ArrayList 时移除一个元素?今天楼主继续分享一道经典Java面试题并进行相关知识点的拓展: 上题:写一段代码在遍历ArrayList时移除一个元素?该问题的关键在于面试者使用的是ArrayList的remove()还是Iterator的remove()方法。是使用正确的方式来实现在遍历的过程中移除元素,而不会出现ConcurrentModificationException异常的示例代码。…

    2022年7月22日
    14
  • linux通配符的用法_linux中rmdir命令

    linux通配符的用法_linux中rmdir命令注意:linux通配符和三剑客(grep,awk,sed)正则表达式是不一样的,因此,代表的意义也是有较大区别的。通配符一般用户命令行bash环境,而linux正则表达式用于grep,sed,awk场景。*:通配符,代表所有(0到多个)字符?:通配符,代表任意1个字符;:连续不同命令的分隔符#:配置文件注释|:管道~:当前用户的家目录-:上一次所在的路径$:变量前需要加的符号/:路径分隔符号,也是…

    2026年1月23日
    4
  • java语法分析器_JavaCC语法分析器

    java语法分析器_JavaCC语法分析器JavaCC JavaCompiler 是 Java 实现的语法分析器 用以根据用户自定义规则进行上下文无关语法内容的分析工作 以简化编译器开发时编写涉及词法 语法 语义规则处理代码时的工程量 较之 C 语言实现的简化编译构造程序 LEX LexicalAnaly 和 YACC YetAnotherCo JavaCC 使用递归下降的语法分析方法 定义的

    2026年3月18日
    2
  • java里Bundle是什么_OSGi 体系结构及Bundle简介

    java里Bundle是什么_OSGi 体系结构及Bundle简介1 OSGi 的体系架构是基于插件式的软件结构 包括一个 OSGi 框架和一系列插件 在 OSGi 中 插件称为 Bundle 其中 OSGi 框架规范是 OSGi 规范的核心部分 它提供了一个通用的 安全可管理的 Java 框架 通过这个框架 可以支持 Bundle 服务应用的部署和扩展 Bundle 之间可以通过 ImportPackag 和 Require Bundle 来共享 Java

    2026年3月16日
    2
  • 贴片电阻电容命名及封装[通俗易懂]

    贴片电阻电容命名及封装[通俗易懂]常见的标准零件件主要有以下几种:电阻(R)、排阻(RA或RN)、电感(L)、陶瓷电容(C)、排容(CP)、钽质电容(C)、二极管(D)、晶体管(Q)。一、零件规格:零件规格即零件的外形尺寸,SMT(表面封装技术)发展至今,业界已经形成了一个标准零件系列,各家零件供货商皆是按这一标准制造。标准零件之尺寸规格有英制与公制两种表示方法,参照下面的常见贴片电阻尺寸表(1inch=25.4m…

    2022年8月21日
    9
  • 百度地图开放平台开发者注册_全国矢量地图shp格式百度云

    百度地图开放平台开发者注册_全国矢量地图shp格式百度云SHA1分为发布版和开发版,便于开发者开发调试和最终上线使用。1通过Eclipse获取使用adt22以上版本,可以在Eclipse中直接查看,具体位置如下:Windows:依次在Eclipse中打开Window->Preferances->Android->Build;Mac:依次在Eclipse中打开Eclipse/ADT->Preferances->Android->Build。在弹出的对话框中SHA1f

    2022年8月10日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号