0.C++之RAII技术解析
1.什么是RAII 技术?
我们在C++中经常使用new申请了内存空间,但是却也经常忘记delete回收申请的空间,容易造成内存泄露,于是RAII技术就诞生了,来解决这样的问题。RAII(Resource Acquisition Is Initialization)机制是Bjarne Stroustrup首先提出的,是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 我们知道在函数内部的一些成员是放置在栈空间上的,当函数返回时,这些栈上的局部变量就会立即释放空间,于是Bjarne Stroustrup就想到确保能运行资源释放代码的地方就是在这个程序段(栈)中放置的对象的析构函数了,因为stack winding会保证它们的析构函数都会被执行。RAII就利用了栈里面的变量的这一特点。RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个存放在栈空间上的局部对象。
这种做法有两大好处:
(1)不需要显式地释放资源。
(2)采用这种方式,对象所需的资源在其生命期内始终保持有效。
2.实战应用
2.1一个简单的例子:指针申请空间,释放空间
[cpp] view plain copy print?
- void Func()
- {
- int *ip = new int[10];
- ...//operations
- ...//operations
- ...//operations
- delete[] ip;//if not free mem, memory overflow
- }
void Func()
{int *ip = new int[10];...//operations...//operations...//operationsdelete[] ip;//if not free mem, memory overflow
}
使用RAII技术后:
[cpp] view plain copy print?
- template<class PointerType>
- class My_Pointer
- {
- public:
- My_Pointer(PointerType* _ptr, size_t sz)
- {
- _ptr = new PointerType[sz];
- m_ptr = _ptr;
- }
- ~My_Pointer()
- {
- delete []m_ptr;
- }
- protected:
- PointerType m_ptr;
- }
template<class PointerType>
class My_Pointer
{
public:My_Pointer(PointerType* _ptr, size_t sz){_ptr = new PointerType[sz];m_ptr = _ptr;}~My_Pointer(){delete []m_ptr;}
protected:PointerType m_ptr;
}
2.2 scope lock (局部锁技术)
在很多时候,为了实现多线程之间的数据同步,我们会使用到 mutex,critical section,event,singal 等技术。但在使用过程中,由于各种原因,有时候,我们会遇到一个问题:由于忘记释放(Unlock)锁,产生死锁现象。
采用RAII 就可以很好的解决这个问题,使用着不必担心释放锁的问题. 示例代码如下:
My_scope_lock 为实现 局部锁的模板类.
LockType 抽象代表具体的锁类 .如基于 mutex 实现 mutex_lock 类.
[cpp] view plain copy print?
- 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;
- }
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;
}
使用的时候:
[cpp] view plain copy print?
- //global vars
- int counter = 0;
- void routine();
- mutex_lock m_mutex_lock;
- void routine()
- {
- My_scope_lock l_lock(m_mutex_lock);
- counter++;
- ...//others...
- }
//global vars
int counter = 0;
void routine();
mutex_lock m_mutex_lock;void routine()
{My_scope_lock l_lock(m_mutex_lock);counter++;...//others...
}
我们可以根据上面的例子类推出好多这样例子。如读写文件的时候很容易忘记关闭文件,如果借用 RAII技术,就可以规避这种错误。再如对数据库的访问,忘记断开数据库连接等等都可以借助RAII 技术也解决。
对象在构造的时候获取资源,在析构的时候释放资源,在整个对象周期内使用资源,对象生命周期结束,资源得到释放。
0.C++之RAII技术解析相关推荐
- 思科ccna认证技术之网络安全基础入门CCNA 1.0 网络硬件防火墙技术解析-ielab
思科ccna认证技术之网络安全基础入门CCNA 1.0 网络硬件防火墙技术解析-ielab防火墙技术,最初是针对 Internet 网络不安全因素所采取的一种保护措施.顾名思义,防火墙就是用来阻挡外部 ...
- 思科安全认证基础入门CCNA 1.0 网络硬件防火墙技术解析-ielab网络实验室
思科安全认证基础入门CCNA 1.0 网络硬件防火墙技术解析-ielab网络实验室防火墙技术,最初是针对 Internet 网络不安全因素所采取的一种保护措施.顾名思义,防火墙就是用来阻挡外部不安全因 ...
- C++之RAII技术解析
RAII 是 Resource Acquisition Is Initialization(资源获取即初始化)的缩写.RAII 是C++ 中常用的一种编程技术,具体是指必须在使用前获取的资源(如栈内存 ...
- 新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室
新版思科CCNA认证1.0 零基础入门技术VTP协议解析-ielab网络实验室 VTP(VLAN Trunking Protocol):VLAN中继协议,是Cisco专用协议.也被称为虚拟局域网干道 ...
- RAII技术与智能指针(超详细)
RAII技术与智能指针 RAII技术与智能指针 RAII技术 什么是RAII技术 实现原理 特征 作用 值语义与对象语义的区分 RAII代码格式 测试代码(Computer类的实现) 结论 智能指针 ...
- CPU三级缓存技术解析
CPU三级缓存技术解析 cpu存取数据 cpu存取数据大致可以认为是下图的流程(此处图比较简单) cpu拿到需要的内存地址,之后这个地址会被mmu转换成真正的物理地址,接下来会去查接下来查L1 cac ...
- 服务器BMC、BIOS、IPMI、UEFI技术解析
服务器BMC.BIOS.IPMI.UEFI技术解析 以BIOS为核心的固件产业,是信创产业链的重要组成部分,可被誉为信创产业的"山海关".在计算机体系中,BIOS 有着比操作系统更 ...
- Tensor Core技术解析(上)
Tensor Core技术解析(上) NVIDIA在SIGGRAPH 2018上正式发布了新一代GPU架构--Turing(图灵),黄仁勋称Turing架构是自2006年CUDA GPU发明以来最大的 ...
- Mask-RCNN技术解析
Mask-RCNN技术解析 MaskR-CNN 论文链接:https://arxiv.org/pdf/1703.06870.pdf 代码链接:https://github.com/CharlesSha ...
最新文章
- Python:尝试对知乎网验证码进行处理
- App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW int
- 【驱动】ubuntu安装内核头文件
- CentOS中使用Docker安装Jenkins
- [0] OpenCV_Notes - 琐碎
- 从傅里叶分析角度解读深度学习的泛化能力
- android jni 释放资源
- mkswap命令详解
- 数据库 测试数据生成_我们的测试数据生成器如何使假数据看起来真实
- 计算机图形数学知识,平面----计算机图形学的基础几何知识
- linux 发文件被过滤的内容,linux文件过滤以及内容编辑处理
- 类间关系有很多种 UML
- elasticsearch】org.elasticsearch.bootstrap.StartupException: java.lang.NullPointerException
- android 4.4 webview 上传,android使用webview上傳文件(適配4.4以上系統)
- ATA接口寄存器描写叙述
- pytorch—torch.tensor.scatter操作解析
- Javascript特效:距离某个时间倒计时
- linux底层内存管理--内核空间的伙伴系统
- vue中ref在input中详解
- yacc 简易计算机规则,YACC 使用说明——计算器实例.pdf