C++里对RAII的理解

全面理解-C++中的RAII机制 是一种核心编程范式,通过对象的生命周期管理资源(如内存、文件句柄、网络连接等),确保资源的。通过 RAII,开发者可以编写更安全、更简洁的代码,是 C++ 区别于其他语言的核心优势之一。:利用栈对象的确定性析构机制,无论代码执行路径如何(包括异常),资源都会被正确释放。:将资源的获取与对象的初始化绑定,释放与对象的析构绑定。:对象独占资源所有权,避免资源泄漏和悬空指针。:操作要么完全成功,要么回滚到操作前的状态。:消除手动管理资源的风险,提升代码健壮性。:确保程序状态一致(不泄漏资源)。 阅读详情

RAII:Resource Acquisition Is Initialization 资源获取即初始化时机。

原理:利用对象的生命周期来管理资源,对象离开作用域自动调用析构函数。

1.RAII特征

  • 在构造时初始化资源或托管资源
  • 析构时释放资源
  • 一般表达对象语义,不允许复制或者赋值
  • 提供若干访问资源的方法

代码示例

class RAII {
 public:
     // 通过构造函数托管资源 
     RAII(T * p)
     : _p(p) {}
     
     // 获取所托管的资源的原生的裸指针
     T * get() { return _p; }
 ​
     // 访问资源的方法 
     T* operator->() { return _p; }
     T & operator*() { return *_p; }
     
     // 重置要托管的指针  
     void reset(T * p) {
         if(_p) {
             delete _p;
             _p = p;
         }
     }
 ​
     ~RAII() {
         if(_p) {
             delete _p;
         }
     }
 ​
 private:
     T * _p;
 };
  
 void test0() {
     //智能指针(对象)托管指针
     RAII<Point> pPoint(new Point(1, 2));
     pPoint->print();
     (*pPoint).print();
     //获取所托管的资源的原生的裸指针
     cout << "address:" << pPoint.get() << endl;
 } 
  
 int main(void) {
     test0();
     return 0;
 }

2.对象语义

值语义:可以进行复制控制。

对象语义:不能进行复制控制,两种实现方法

//1.将拷贝构造函数和赋值运算符函数设置为私有(C++11前)
private:
//表达对象语义,禁止复制
SafeFile(const SafeFile &);
SafeFile & operator=(const SafeFile&);
//2.将拷贝构造函数和赋值运算符函数使用 =delete(C++11标准)
SafeFile(const SafeFile &) = delete;
SafeFile & operator=(const SafeFile&) = delete;

代码示例

//对象语义SafeFile
 #include <stdio.h>
 #include <iostream>
 #include <string>
 #include <fstream>
 using std::cout;
 using std::endl;
 using std::string;
 using std::ifstream;
 ​
 class SafeFile {
 public:
     // 构造函数初始化资源
     SafeFile(const string & filename)
     : _fp(nullptr) 
     {
         _fp = fopen(filename.c_str(), "a+");
         if(!_fp) {
             cout << "file " << filename << "not found" << endl;
         }
     }
 ​
     SafeFile(FILE * fp)
     : _fp(fp)
     {}
 ​
     
     void write(const string & str) {
         fwrite(str.c_str(), 1, str.size(), _fp);
     }
     
     // 析构时释放资源
     ~SafeFile() {
         if(_fp) {
             fclose(_fp);
             cout << "fclose(_fp)" << endl;
         }
     }
 ​
     // 2、C++11标准
     // 将拷贝构造函数和赋值运算符函数从当前类中删除掉
     SafeFile(const SafeFile &) = delete;
     SafeFile & operator=(const SafeFile&) = delete;
 ​
 private:
     // 1、C++11标准之前
     // 将拷贝构造函数和赋值运算符函数设为私有
     // SafeFile(const SafeFile &);
     // SafeFile & operator=(const SafeFile&);
     
 private:
     FILE * _fp;
 };
  
 void test0() {
     // 通过对象来托管文件指针,不需要进行文件指针的回收
     // sf对象生命周期被销毁时,会自动调用其析构函数,在析构函数内完成资源回收
     SafeFile sf("test.txt");
     // 只需要负责对文件指针进行操作即可
     sf.write("this is a test line\n");
 ​
     FILE * fp = nullptr;
     SafeFile sf2(fp);
     //sf2 = sf;//error  调用赋值运算符函数
     //SafeFile sf3 = sf;//error 调用拷贝构造函数
 } 
 ​
 void test1() {
     // C++的所有流对象都是不能进行复制的,表达对象语义(客观对象都是独一无二的)
     ifstream ifs("test.txt");
     ifstream ifs2 = ifs; //调用拷贝构造函数
 }
  
 int main(void) {
     test0();
     return 0;
 }
C++中RAII机制的介绍与简单实例 今天看陈硕的多线程书上提到了C++中RAII技术的使用,通过用C11里面自带的智能指针来完成对资源的控制,但是一直不太清楚具体RAII是怎么样的,带着这样的疑问,特地去看了几篇博客,找了一个简单的文件句柄打开关闭RAII管理的实例,瞬间就明白了,这里分享出来。主要从两个部分,首先是RAII技术的介绍,然后是RAII技术的简单实例。 RAII技术的介绍 1、RAII定义 RAII,它是“Resour... 阅读详情

相关推荐

详解C++ RAII机制

什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。 为什么要使用RAII? 上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程

Lee notes 3817

浅谈C和C++中的资源释放

浅谈C和C++中的资源释放 一、简介 二、实现资源释放的有效途径 1. C实现资源释放的有效途径 (1) 巧用 do{}while{0} (2) goto 语句实现资源回收 2. C++实现资源释放的有效途径 (1) RAII(Resource Acquisition is Initialization)——资源获取即初始化 (2) RAII工厂类 (3) 智能指针 四...

Litost_Cheng的博客 5302

【RAII 思想】RAII 基本概念(一种思想)

RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。当使用RAII时,资源的获取和释放被封装在对象的构造函数和析构函数中,从而确保资源的正确获取和释放。

Michael 7538

C++RAII机制

什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源...

风一样的男子(quinta)的博客 2万+

C++中RAII的惯用方法

软件开发中,会用到各种各样的资源。狭义的资源指内存,而广义的资源包括文件、网络连接、数据库连接、信号量、事件、线程、内存等,甚至可以是状态。资源获取后由于种种原因导致永久不能释放的资源称为资源泄漏。针对资源泄漏,提出了各种各样的软件机制和程序设计惯用法,如垃圾收集、RRID[1]、RAII、确定性资源清理等。 RAII是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造

鱼思故渊的专栏 2480

C++中的RAII机制?

什么是RAII? RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。 为什么要使用RAII? 上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程

sixstar666的博客 1201

C++的RAII机制

RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。

ljy的博客 1240

存内计算路线再获加持,清华存内芯片登Science

通过这种方法,可以比较有效的控制二氧化铪忆阻层中的微观变化,以及内部的温度和电场,使得器件具有非常优异的电学特性,而且可以在工厂里大规模生产,推动了高性能忆阻器阵列的诞生。团队搭建了全硬件构成的完整存算一体系统,如下图7所示,在系统里集成了多个忆阻器阵列,并在该系统上高效运行了卷积神经网络算法,成功验证了图像识别功能,证明了存算一体架构全硬件实现的可行性,并且成功实现了以更小的功耗和更低的硬件成本完成复杂的计算[6]。根据测试,在一般神经网络中权重更新的最后阶段,调整步长非常接近0,如图9(C)所示,

PXX12345678的博客 1555

【C++高阶】深入理解C++智能指针:掌握RAII与内存安全的利器

在C++的浩瀚宇宙中,内存管理一直是程序员们必须面对的重要课题。从早期的手动分配与释放,到现代C++标准库中引入的智能指针,每一次进步都标志着C++在提升开发效率、减少错误风险方面的巨大飞跃。智能指针,作为C++11及后续版本中不可或缺的一部分,不仅极大地简化了资源管理,还通过其独特的机制有效防止了内存泄漏和野指针的出现,成为了现代C++编程中不可或缺的工具

EterNity_TiMe_的计算机学习之路 1万+

Vivado FIR Complier_IP核使用方法

文章依靠该IP核对应手册PG149写的,因为笔者需求简单,没有深入挖掘功能,可以自行下载学习。

2302_80180551的博客 3985

SAP ABAP实战:用BAPI_PO_CREATE1创建采购订单时,如何巧妙处理PBXX和PB00条件类型?

本文深入探讨了在SAP ABAP开发中使用BAPI_PO_CREATE1创建采购订单时,如何有效处理PBXX和PB00条件类型的难题。通过分析外协加工订单的特殊需求,提供了从问题定位到解决方案的全流程方法,包括数据流向追踪、字段控制策略和增强实现方案,帮助开发者解决条件类型自动生成的业务痛点。

weixin_30614109的博客 824

详解C++11 RAII机制

什么是RAII?RAII是Resource Acquisition Is Initialization(wiki上面翻译成 “资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。为什么要使用RAII?上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程序了,

长期更新自学笔记 7380

LabVIEW内存优化实战:用DVR和队列高效处理大型数组,告别数据副本

本文深入探讨LabVIEW内存优化技术,重点介绍数据值引用(DVR)和单元素队列(SEQs)在高效处理大型数组中的应用。通过对比传统方法与现代引用技术的性能差异,提供减少内存副本、提升程序效率的实战方案,帮助开发者在测试测量、图像处理等数据密集型场景中实现显著性能提升。

weixin_30835649的博客 1061

《 C++ 点滴漫谈: 三十九 》不泄露的秘密:用 RAII 打造稳健的 C++ 程序

本篇博客深入解析了 C++ 中的 RAII(资源获取即初始化)机制,从基础原理到现代语法融合,全面剖析其在资源管理、异常安全和工程实践中的重要价值。文章不仅涵盖智能指针、锁管理、文件封装等典型应用场景,还探讨了 RAII 与 C++20 协程、事务控制等前沿技术的结合。同时指出常见误区与调试技巧,帮助开发者构建更加健壮、安全、易维护的 C++ 应用程序。

Lenyiin 3365

Spring AI 实战:5 分钟搭建你的第一个 AI 应用(含完整代码)

能力关键 API适用场景基础对话简单问答、文本生成流式输出实时打字机效果@Bean模型需要调用外部工具结构化输出需要返回 Java 对象多轮对话聊天机器人场景Spring AI 让 Java 开发者可以用最熟悉的方式(Spring Boot + Maven)进入 AI 应用开发领域,不用学新语言,不用换框架,这是它最大的优势。但目前为止,我们的 AI 应用只能回答"它脑子里已有的知识"。如果让它读懂你自己的技术文档、公司内部知识库呢?这就是下一篇文章的主题——RAG(检索增强生成)实战。

qq_17204557的博客 642

部分旧版统信国产系统下载资源

注:全部自来网络查找,建议到官网下载最新版。

aggs1990的专栏 5235

C++ RAII机制浅谈

RALL机制使得C++程序员能够优雅的释放内存。

树欲静静风不止止的博客 3978

【Bug已解决】Claude Team Plan 购买席位报错 Payment failed 解决方案

方案适用场景推荐指数检查账单历史状态排查的第一步⭐⭐⭐⭐⭐更换支付方式类型快速尝试是否能绕开问题⭐⭐⭐联系官方支持团队最终解决问题的正规渠道⭐⭐⭐⭐⭐临时过渡方案紧急用人需求的应急处理⭐⭐⭐关注官方修复进度确认属于系统性缺陷的场景⭐⭐⭐⭐Claude Team Plan 增购席位报的问题,社区反馈和实际排查表明很大概率属于平台计费系统在处理按比例分摊费用这类复杂计算链路时的系统性缺陷,而不是用户自身的支付信息填写有误。先排除自身账单历史是否存在异常。

一键难忘的博客 4179

C++ RAII

为什么80%的码农都做不了架构师?>>> ...

weixin_34138139的博客 824

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c++ RAII的理解

RAII:Reource Acquisition Is Initializetion(资源获取即初始化),是利用C++类对象的生命周期管理资源的一种方式(包括:分配的堆内存、线程资源、socket、打开的文件、锁、磁盘空间、数据库连接等)。这种技术的另一个名称是SBRM(作用域绑定资源管理),RAII对象的生命周期由于作用域退出而结束。 RAII可以总结如下: 将每个资源封装到一个类中 构造函数获取资源并创建类的所有变量,若不能完成则抛出异常 析构函数释放资源同时不能抛出异常 始终通过RAII类的实

David 433

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】智能指针(RAII)详解

我们在上篇文章中提到了 RAII 。那么本篇文章会对此进行详解。重点是智能指针的详解。其中会讲解到 RAII 思想、auto_ptr、unique_ptr、shared_ptr、weak_ptr、循环引用问题。希望本篇文章会对你有所帮助。

weixin_67596609的博客 2262

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++中的RAII机制

什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。 为什么要使用RAII? 上面说到RAII是用来管理资源、避免资源泄漏的方法。那么,用了这么久了,也写了这么多程序了,口头上经常会说资源,那么资源是如何

Lce的专栏 752

C++学习:六个月从基础到就业——内存管理:RAII原则

RAII(Resource Acquisition Is Initialization)是一种C++编程范式,字面意思是"资源获取即初始化"。这个名字来源于它的核心思想:将资源的获取与对象的初始化(构造)绑定,将资源的释放与对象的销毁(析构)绑定。在RAII模式下,资源(如内存、文件句柄、锁等)由对象的构造函数获取,并由析构函数自动释放。由于C++保证对象离开作用域时会调用其析构函数,这就确保了资源的正确释放,无论函数如何返回(正常返回或异常返回)。

qq_53773901的博客 1970

C++ RAII机制

前言 在写C++设计模式——单例模式的时候,在写到实例销毁时,设计的GC类是很巧妙的,而这一巧妙的设计就是根据当对象的生命周期结束时会自动调用其析构函数的,而这一巧妙的设计也是有专业的名词的——RAII。那以下将围绕RAII,全面的讲解RAII的相关知识。 什么是RAII? RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取

大头蚂蚁的窝 219
上一篇: Qt案例Extension学习记录
下一篇: 【QML学习】文本框输入
照书抄代码
博客等级 码龄8年 32粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值