在C语言中,资源管理是一个极为繁琐易错的工作,大多复杂的C系统都面临着内存泄露、悬挂指针等问题。这是一方面是由底层语言的特点决定;另一方面也是由于C语言特性相对较少,严重依赖程序员进行正确的资源管理,缺乏有效的支持手段。
创新互联是专业的昂昂溪网站建设公司,昂昂溪接单;提供网站建设、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行昂昂溪网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
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对象间的赋值是一个需要特别注意的地方。简单说来资源代理对象间赋值的语义不满足“赋值相等”,其语义是资源管理权的转移。
什么是“赋值相等”呢?比如:
- int a;
- int b = 10;
- a = b; //这句话执行后 a == b
但对于资源代理对象,这是不满足的,比如:
- auto_ptr
a(null); - auto_ptr
b(new int(123)); - a = b; //这句话执行后a != b,赋值的语义是b把资源的管理权交给了a
网页标题:简单介绍C++RAII
分享链接:http://www.mswzjz.com/qtweb/news4/176404.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联