浅析 C++ 之 RAII

C++中RAII机制的介绍与简单实例 今天看陈硕的多线程书上提到了C++中RAII技术的使用,通过用C11里面自带的智能指针来完成对资源的控制,但是一直不太清楚具体RAII是怎么样的,带着这样的疑问,特地去看了几篇博客,找了一个简单的文件句柄打开关闭RAII管理的实例,瞬间就明白了,这里分享出来。主要从两个部分,首先是RAII技术的介绍,然后是RAII技术的简单实例。 RAII技术的介绍 1、RAII定义 RAII,它是“Resour... 阅读详情

1.什么是RAII 技术?(参见百度百科相关条目)

      RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 
  RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处: 

  • 不需要显式地释放资源。 
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

2.实战应用

     2.1 scope lock (局部锁技术) (参见 ACE  ACE_Gaurd 模板类的实现)

     在很多时候,为了实现多线程之间的数据同步,我们会使用到 mutex,critical section,event,singal 等技术。但在使用过程中,由于各种原因,有时候,我们会遇到一个问题:由于忘记释放(Unlock)锁,产生死锁现象。

     采用RAII 就可以很好的解决这个问题,使用着不必担心释放锁的问题. 示例代码如下:

     My_scope_lock 为实现 局部锁的模板类.

     LockType 抽象代表具体的锁类 .如 基于 mutex 实现 mutex_lock 类.

template<class LockType>

class My_scope_lock
{

   public:

   My_scope_lock(LockType& _lock):m_lock(_lock)

   {

         m_lock.occupy();

    }

   ~My_scope_lock()

   {

        m_lock.relase();

   }

   protected:

   LockType    m_lock;
}

  开发中使用示例:

  假设对Data 类中的数据操作需要 互斥控制.

 1 class Data
 2 {
 3  public:
 4  Data();
 5  ~Data();
 6  bool getdata();
 7  bool savedata();
 8  bool update();
 9  private:
10  mutex_lock  m_mutex_lock;
11}

   在Update 方法中使用了局部锁 (scope_lock) .在Update 函数中我们声明了 My_Scope_Lock 局部变量.在My_Scope_Lock  的构造函数中我们 已经下达了对数据加以了保护的"命令". 大家都知道,当函数推出的时候,局部变量会自动被回收,也就是说 My_Scope_Lock 的析构函数会被自动的调用,即自动释放锁.这样永远都不会出现死锁现象.如果不使用局部锁技术,我们就要在函数的每一个出口处去释放锁,这样很容易出错,且代码不优雅不易维护.

 

 1 bool  class Data::Update( )
 2 {
 3  My_scope_lock l_lock(m_mutex_lock);
 4  
 5  if()
 6  {
 7     return false;
 8  }
 9  else
10  {
11    // execute
12  }
13  return true;
14}

 

      我们可以根据上面的这个例子类推出好多这样例子. 如,读写文件的时候,很容易忘记关闭文件,如果借用 RAII

技术,就可以规避这种错误.再如对数据库的访问,忘记断开数据库连接等等,都可以借助RAII 技术也解决.

     2.2 资源释放    

     资源释放方面,RAII有其特有的优势:如果使用scope(exit)的话,每个资源分配之后都需要用一个scope(exit)跟在后面保护起来;而如果用RAII的话,一个资源申请就对应于一个RAII对象的构造,释放工作则被隐藏在对象的析构函数中,从而使代码主干保持了清爽。

   尤其,当我们 使用 exception 异常处理机制时,RAII 会给我们带来很大的帮助.


原文出处:

http://kb.cnblogs.com/a/1602514/

c++11中的lock_guard和unique_lock使用浅析 锁 锁用来在多线程访问同一个资源时防止数据竞险,保证数据的一致性访问。 多线程本来就是为了提高效率和响应速度,但锁的使用又限制了多线程的并行执行,这会降低效率,但为了保证数据正确,不得不使用锁,它们就是这样纠缠。 作为效率优先的c++开发人员,很多人谈锁色变。 虽然有很多的无锁技术应用到项目中来,但是还是很有必要对锁的技术有一个基础的理解。本文主要讨论c++11中的两种锁:lock_guard ... 阅读详情

相关推荐

补洞与fairing算法

对网格进行补洞,remesh, 平滑,fairing, 最小二乘优化平滑

闪电彬彬的博客 1047

C++资源管理手法之RAII类

C++资源管理手法之RAII类,以对象的方式管理动态分配的堆资源,尽可能避免资源泄露

zwjason1999 的博客 435

Coze智能体网页集成实战:从零搭建免登录AI助手

本文详细介绍了如何利用Coze Chat SDK从零开始为网站集成免登录AI助手。通过获取访问令牌和智能体ID,仅需几行JavaScript代码即可将功能完整的对话窗口嵌入网页,实现开箱即用的智能交互。文章重点讲解了核心部署步骤、会话隔离方案以及UI深度定制方法,帮助开发者快速打造贴合品牌、提升用户体验的网页AI助手。

gold8的专栏 553

个人笔记:C++之RAII

理解RAII类 RAII:Resource Acquisition Is Initialization。 用中文来说就是资源获取就是初始化。在这个类的实例的生命周期中,初始化构造的时候,就将资源获取了,而在调用析构函数的时候,将资源释放了,这样避免了资源的泄露。 所以重点在于使用什么手段来结束类的生命周期?在这里与程序中的栈的局部变量的生命周期的,因为在函数调用结束后,系统会将栈的空间进行回收,如果是分配在栈空间上的类,则会在这个过程中调用类的析构函数。而在RAII类的实现中,正是利用了这个机制,将RAII

weixin_42146864的博客 349

kali破解wifi之airmon-ng 工具利用

......

qq_42378173的博客 1万+

DolphinScheduler工作流中ChunJun任务保存失败的深度解析与实战修复

本文深度解析了在DolphinScheduler工作流中创建ChunJun任务时遭遇“parameter invalid”保存失败的普遍问题。其根源在于前端表单的`customConfig`参数默认值与后端校验逻辑不匹配。文章提供了两种实战修复方案:一是修改前端源码并重新编译,二是热更新已部署的JS文件,并对比了其适用场景与风险,帮助用户彻底解决此集成障碍。

weixin_29010003的博客 395

C++之RAII技术解析

转载:C++之RAII技术解析 1.什么是RAII 技术? 我们在C++C++C++中经常使用newnewnew申请了内存空间,但是却也经常忘记deletedeletedelete回收申请的空间,容易造成内存溢出,于是RAIIRAIIRAII技术就诞生了,来解决这样的问题。RAIIRAIIRAII(ResourceResourceResource AcquisitionAcquisitionA...

小二笙的博客 397

Revit实战:从零到一,手把手教你用族(Family)搭建一个完整的水闸BIM模型

本文详细介绍了如何使用Revit的族(Family)功能从零开始构建一个完整的水闸BIM模型。通过参数化族设计,实现闸门开度调整自动关联流量计算等智能化功能,提升水利工程BIM模型的工程价值和应用效率。文章涵盖族库规划、核心构件创建、高级技巧及BIM数据深度应用,为水利工程数字化提供实用指南。

weixin_28738165的博客 261

effective c++条款13-17 “以对象管理资源”之RAII浅析

RAII是指C++语言中的一个惯用法(idiom),它是“Resource Acquisition Is Initialization”的首字母缩写。中文可将其翻译为“资源获取就是初始化”。虽然从某种程度上说这个名称并没有体现出该惯性法的本质精神,但是作为标准C++资源管理的关键技术,RAII早已在C++社群中深入人心。 使用局部对象管理资源的技术通常称为“资源获取就是初始化”。这种通用技术依赖

hustyangju的足迹 826

【PCIe 总线及设备入门学习专栏 6.1 -- PCIe MCTP】

MCTP 是由 DMTF(Distributed Management Task Force)定义的协议,用于提供设备和主机间基于不同传输层(如 PCIe、I²C、USB 等)的管理消息通信能力。在 PCIe 环境下,MCTP 消息作为的一种特殊形式传输,并被赋予唯一的 VDM Code 值0000b,以区别于其他 VDM。MCTP 在 PCIe 环境中作为一种基于 Type 1 VDM 的管理通信协议,提供了设备与主机之间的灵活数据传输能力。

CodingCos的博客 2126

【Camera2教程一】Camera2的框架Pipeline和framework中核心类和接口的详细介绍

Camera2 的 API 模型被设计成一个 Pipeline(管道),它按顺序处理每一帧的请求并返回请求结果给客户端。

jiangchaobing_2017的博客 790

C++ RAII机制

RAII 的全称是 Resource Acquisition Is Initialization,它是一种编程技术,用于管理资源的生命周期,确保在对象的构造函数中获取资源,而在析构函数中释放资源。这个技术是基于C++的对象生命周期和作用域规则的特性来实现的。资源的获取:RAII的核心思想是,将资源(如内存、文件句柄、互斥锁等)的获取操作放在对象的构造函数中。这意味着在创建对象时,资源将被自动获取,并且只有在对象的构造函数成功完成后,资源才会被获取。这样可以确保资源在有效的对象生命周期内一直可用。资源的释放。

泠山的博客 1119

刷机维修进阶教程-----oppo机型 一加 7pro 修复基带 更改参数 实例详细步骤解析

通过课程基本可以了解 1-----oppo机型与一加7机型更改参数的具体步骤解析 2------了解oppo机型开启diag端口的具体步骤 3-----了解一加7这些机型改参数常识 。可以借鉴参考用于其他机型 4-----了解手机基带分区与基带辅助分区的作用 5-----机型参数能读取到 但不能写这种情况如何操作

小马哥的专栏 1477

C++的RAII和智能指针小结

RAII:资源分配即初始化,利用构造函数和析构函数定义一个类来完成对资源的分配和释放智能指针主要用来防止内存泄漏,我们来举个栗子,看看为什么会有智能指针这个东东例1:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7E/9B/wKiom1cFEh6BAN-AAABe101cjJc063.png" title="Image.png"

福大馨的博客 1731

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C++ 智能指针浅析

C++智能指针通过RAII机制自动管理内存,解决了原始指针的内存泄漏、野指针等问题。标准库提供了三种智能指针:unique_ptr(独占所有权,高效)、shared_ptr(共享所有权,引用计数)和weak_ptr(弱引用,解决循环引用)。最佳实践包括优先使用make_shared/make_unique、避免原始指针混用、处理循环引用以及自定义删除器。智能指针选择需根据资源所有权和生命周期决定,unique_ptr效率最高,shared_ptr适合共享资源,weak_ptr用于观察资源。合理使用智能指针能

物换星移几度秋 876

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++智能指针:从RAII原理到实战避坑指南

在C++编程中,内存管理是开发者必须面对的核心挑战。RAII(资源获取即初始化)作为一种关键的设计理念,通过将资源生命周期与对象生命周期绑定,为自动化资源管理提供了理论基础。基于RAII实现的智能指针技术,通过封装原生指针并自动管理内存释放,极大地提升了代码的安全性与可维护性。其技术价值在于消除了手动内存管理常见的内存泄漏、悬空指针等问题,同时通过明确的所有权语义(独占、共享、弱引用)使程序数据流设计更加清晰。在实际应用场景中,智能指针广泛用于工厂模式、缓存管理、容器存储及多线程环境下的对象生命周期管理。本

weixin_33146151的博客 302

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C++项目集成zip.cpp与unzip.cpp实现无依赖压缩解压方案

在C++开发中,文件压缩与解压是处理数据打包、日志归档和资源分发的常见需求。其核心原理通常基于ZIP容器格式,通过Deflate等压缩算法减少数据体积。从技术价值看,一个轻量、高效且无外部依赖的压缩解压方案能显著提升项目的可移植性和部署简便性,尤其适用于嵌入式环境或对第三方库有严格限制的场景。应用上,这类方案常被用于日志轮转、配置文件打包、网络传输前的数据压缩等。本文聚焦于zip.cpp和unzip.cpp这两个单文件实现,它们通过内嵌精简的zlib逻辑,提供了纯C++的ZIP格式读写能力,支持跨平台集成,

weixin_32932149的博客 230

浅析C++内存分配器:malloc/free与new/delete的差异

核心差异是底层内存操作工具,不管理对象生命周期;new/delete是C++面向对象的核心机制,集成构造、析构和类型安全。使用建议:在C++中,优先使用new/delete(尤其涉及类对象),以利用RAII和异常安全;仅在需要与C代码交互或低级优化时使用。关键公式:内存大小计算差异可总结为:new:自动处理$ \text{sizeof}(T) $和初始化。通过以上分析,您可更安全高效地选择内存分配器。若有具体场景疑问,可进一步探讨!

2501_93895308的博客 766

C++中的线程同步机制浅析

优先使用RAII:始终使用,避免手动。用互斥量保护数据,而非代码:清晰地知道哪些数据是共享的,并用最小的锁粒度来保护它。慎用递归锁:递归锁通常意味着糟糕的设计。使用条件变量进行事件等待:不要使用忙等待(while (!),这会浪费CPU资源。警惕死锁:使用锁顺序、std::lock等策略来预防。性能瓶颈在于锁竞争:优化方向是减少共享和缩小临界区,而非盲目追求“无锁”。无锁编程极其复杂且容易出错。简单场景用atomic,复杂同步用mutex:对于简单的计数器或标志位,是更好的选择。

码事漫谈 831

C++异常处理:从RAII到noexcept的工程实践指南

异常处理是现代编程语言中处理运行时错误的核心机制,它通过分离正常流程与错误处理逻辑,显著提升代码的健壮性和可维护性。其原理基于栈展开和对象析构,在异常抛出时自动清理资源,这是实现异常安全性的基础。在C++中,这一机制与RAII(资源获取即初始化)范式深度结合,通过智能指针等工具自动化资源管理,确保即使在异常发生时也不会发生内存泄漏。异常处理的技术价值在于支持强异常保证,使关键操作具备原子性,要么完全成功,要么完全回滚,这对于数据库事务、文件操作等场景至关重要。在实际工程中,合理运用try-catch块、标准

weixin_33717117的博客 336

C到C++平滑过渡指南:面向对象、RAII与STL核心实践

面向对象编程(OOP)是一种将数据和操作封装为对象的编程范式,其核心在于通过类实现封装、继承和多态,提升代码的模块化和复用性。在C++中,这一理念与RAII(资源获取即初始化)原则紧密结合,通过构造函数和析构函数自动管理资源生命周期,从根本上解决了C语言中手动管理内存等资源易出错的问题。这种范式转变带来了更高的代码健壮性和可维护性,尤其适用于构建大型复杂系统。同时,C++标准模板库(STL)提供了丰富的容器、算法和迭代器,让开发者能高效处理通用数据结构与算法,告别重复造轮子。本文聚焦于C程序员向C++转型的

weixin_34014555的博客 322
上一篇: C++11std::unique_lock与std::lock_guard的区别及多线程应用实例
下一篇: C++11之future,promise,packaged_task,async详解
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值