RALL

  产生原因:

     在C++中,如果在这个程序段结束时需要完成一些资源释放工作,那么正常情况下自然是没有什么问题,但是当一个异常抛出时,释放资源的语句就不会被执行。于是Bjarne Stroustrup就想到确保能运行资源释放代码的地方就是在这个程序段(栈帧)中放置的对象的析构函数了,因为stack winding会保证它们的析构函数都会被执行。

将初始化和资源释放都移动到一个包装类中的好处:

     - 保证了资源的正常释放

     - 省去了在异常处理中冗长而重复甚至有些还不一定执行到的清理逻辑,进而确保了代码的异常安全。

     - 简化代码体积。

 

简介:

  RAII,也称为“资源获取就是初始化”,是c++等编程语言常用的管理资源、避免内存泄露的方法。它保证在任何情况下,使用对象时先构造对象,最后析构对象

 

理解: RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。

 

根据RAII  对资源的所有权可分为常性类型和变性类型,代表者分别是boost:shared_ptr<> 和std::auto_ptr<>;

               从所管资源的初始化位置上可分为外部初始化类型和内部初始化类型。

 

常性类型是指获取资源的地点是构造函数,释放点是析构函数,并且在这两点之间的一段时间里,任何对该RAII类型实例的操纵都不应该从它手里夺走资源的所有权。

变性类型是指可以中途被设置为接管另一个资源,或者干脆被置为不拥有任何资源。

 

外部初始化类型是指资源在外部被创建,并被传给RAII实例的构造函数,后者进而接管了其所有权。boost:shared_ptr<>和std::auto_ptr<>都是此类型。与之相对的是内部初始化类型。

     常性且内部初始化的类型是最为纯粹的RAII形式,最容易理解,最容易编码。

 

RAII使用

     每当处理需要配对的获取/释放函数调用的资源时,都应该将资源封装在一个对象中,实现自动资源释放。

总结1:

     RAII的核心思想 是 使用对象管理资源 , 对象“消亡”则自动释放资源。理解和使用RAII能使软件设计更清晰,代码更健壮。

     与大名鼎鼎的垃圾收集(GC)不同的是,RAII可管理广义的资源,而垃圾收集只关注“内存泄漏”,不关心诸如文件句柄、同步对象等一些系统资源的泄漏问题。RAII能使程序员确定资源释放的时机,这也正是C++/CLI引入确定性资源清理的原因。

 

 

总结2:

     RAII的本质内容是用对象代表资源,把管理资源的任务转化为管理对象的任务,将资源的获取和释放与对象的构造和析构对应起来,从而确保在对象的生存期内资源始终有效,对象销毁时资源必被释放。换句话说,拥有对象就等于拥有资源,对象存在则资源必定存在。

 

 

来源: http://baike.baidu.com/link?url=gQl-DBn1SreGktSVdlynyrSFEDPlBImnl6FKFJHTp7QQ06PammckYXouw5LZQm4rnGl3l9pVcVloAZ8BXAX2Qa

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值