听到这么高端霸气的名字顿觉自己极致土鳖,介是何方神圣呢,其全称是Resource Acquisition Is Initialization 其起源是为了完成异常安全资源管理的愿景。
RAII中资源的持有是与对象的生命周期完全吻合在一起的:资源分配在对象创建的时候完成,而在对象析构时完成资源的释放。只要对象适当地销毁,资源泄漏就不会发生。
示例代码如下:
上面这段代码是异常安全的,因为C++保证在enclosing作用域结束时,会销毁所有栈变量,可参考stack unwinding ,不管是否发生异常lock和file对象在从当前函数中返回时会,它们的析构函数会被调用。局部变量使得在单个函数中进行多个资源的管理变得很简单:局部变量会按它们构造的反序进行析构,并且一个对象必须在完全构造(即构造的过程中没有发生异常)之后才会被销毁。
Stroustrup在比较RAII与java中的finally的时候放了狠话:现实中,资源获取的场景比资源的种类要多得多得多,所以RAII比finally结构用的代码会更少。
所以问题来了,异常发生的时候,怎样保证局部变量的析构呢?
另外动态分配的对象也可以由RAII机制控制,以便RAII对象(局部变量)析构时相应资源被释放。为了达到这个目的,可以使用C++11中定义的智能指针std::unique_ptr和std::shared_ptr,C++98中对应的是std::auto_ptr和boost中的boost::shared_ptr。
意外发现一个进阶的C机制