简单介绍C++ RAII

开发 后端
这里介绍C++ RAII,C#和C++两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RAII。

在C语言中,资源管理是一个极为繁琐易错的工作,大多复杂的C系统都面临着内存泄露、悬挂指针等问题。这是一方面是由底层语言的特点决定;另一方面也是由于C语言特性相对较少,严重依赖程序员进行正确的资源管理,缺乏有效的支持手段。

C#和C++两门语言的定位不同,它们在资源管理方面采取了两种截然不同的方式:一为GC,一为RAII。GC让程序建立在更高的抽象层次上,使资源管理变得更方便,更安全;而C++ RAII则保留了C的底层能力,同时在C++特性的支持下提供了简单有效的资源管理方式。我们知道C++最激烈的批评往往来自于C社区,而在我看来C程序员可以不接受虚函数,不接受模板,但有什么理由不接受RAII呢?可以说RAII是C++相对C来说几乎无副作用的明显进步。

C++ RAII

RAII是resource acquisition is initialization的缩写,意为“资源获取即初始化”。它是C++之父Bjarne Stroustrup提出的设计理念,其核心是把资源和对象的生命周期绑定,对象创建获取资源,对象销毁释放资源。在RAII的指导下,C++把底层的资源管理问题提升到了对象生命周期管理的更高层次。上面的例子,我们把new所获取的内存块视为资源,把r对象视为资源的代理对象,r应负责资源的获取和释放。在栈语义和操作符重载的支持下,C++ RAII体现出了简洁、安全、实时的特点:

1.概念简洁性:让资源(包括内存和非内存资源)和对象的生命周期绑定,资源类的设计者只需用在类定义内部处理资源问题,提高了程序的可维护性

2.类型安全性:通过资源代理对象包装资源(指针变量),并利用运算符重载提供指针运算方便使用,但对外暴露类型安全的接口

3.异常安全性:栈语义保证对象析构函数的调用,提高了程序的健壮性

4.释放实时性:和GC相比,RAII达到了和手动释放资源一样的实时性,因此可以承担底层开发的重任

也许你还在惊讶RAII如此简单的时候,关于RAII的主要内容已经介绍完了。简单不意味着简陋,在我看来RAII虽然不像GC一样,是一套具体的机制,但它蕴含的对象与资源关系的哲学深度的理解却使得我对Bjarne Stroustrup肃然起敬!

最后,不得不提醒RAII的理念固然简单,不过在具体实现的时候仍有需要小心的地方。比如对于STL的auto_ptr,可以视为资源的代理对象,auto_ptr对象间的赋值是一个需要特别注意的地方。简单说来资源代理对象间赋值的语义不满足“赋值相等”,其语义是资源管理权的转移。

什么是“赋值相等”呢?比如:

  1. int a;  
  2. int b = 10;  
  3. a = b; //这句话执行后 a == b 

但对于资源代理对象,这是不满足的,比如:

  1. auto_ptr<int> a(null);  
  2. auto_ptr<int> b(new int(123));  
  3. a = b; //这句话执行后a != b,赋值的语义是b把资源的管理权交给了a 

【编辑推荐】

  1. C#局部类型介绍
  2. C#固定指针简单介绍
  3. 浅析C# FTP WebRequest对象
  4. C#分部方法的应用场景
  5. 简单介绍VB.NET和C#
责任编辑:佚名 来源: 博客园
相关推荐

2009-08-25 14:42:41

由C++转向C#

2010-02-01 17:19:30

C++运行机制

2011-06-09 15:04:22

RAII机制

2024-03-04 10:53:08

RAIIC++开发

2010-02-07 14:17:45

Ubuntu8.10

2009-08-19 13:36:21

C++资源管理方式

2023-12-20 12:40:51

C++RAII编程

2021-06-09 09:49:35

C++RAII语言

2010-01-15 15:52:18

CC++

2010-01-15 10:41:06

CC++

2010-01-26 10:27:43

C++语言

2009-08-19 10:09:21

C#和C++

2010-01-18 10:16:58

学习C++

2010-01-25 18:19:17

C++特性

2010-02-03 16:35:45

C++回文

2011-06-17 16:09:04

freadfwrite

2010-01-25 18:19:17

C++特性

2010-01-25 17:55:38

C++头文件

2010-01-25 18:19:17

C++特性

2010-01-19 17:54:47

C++程序
点赞
收藏

51CTO技术栈公众号