程序设计理念-RAII

RAII(Resource Acquisition Is Initialization),也称为”资源获取就是初始化”,是一种C++语言管理资源、避免资源泄露的用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII 的做法是使用一个对象,在其构造时获取资源,在对象生命期控制对资源的访问使之始终保持有效,最后在对象析构的时候释放资源。

首先资源是一个比较广的定义,不仅包括内存上的,也包括文件的打开与关闭、句柄的获取与释放、网络套接字等等。

一个资源管理的bad case:

这么写不好的原因主要在于我们需要为所有new分配的内存再手动delete掉,主要的问题是在这个过程中如果在中间的DoSomething过程中发生了异常而退出,此时我们new的内存就没有释放掉从而导致了内存的泄露。而且这么写,代码可维护性也较差,处理资源释放的代码可能会很多

RAII的使用方法:当我们在一个函数内部使用局部变量,当退出了这个局部变量的作用域时,这个变量也就别销毁了;当这个变量是类对象时,这个时候,就会自动调用这个类的析构函数,而这一切都是自动发生的,不要程序员显示的去调用完成。这个也太好了,RAII就是这样去完成的。

如果把资源用类进行封装起来,对资源操作都封装在类的内部,在析构函数中进行释放资源。当定义的局部变量的生命结束时,它的析构函数就会自动的被调用,如此,就不用程序员显示的去调用释放资源的操作了。

一个用RAII机制的example:

在我看来,RAII的思想的精髓就在于充分利用C++中的类的思想,尤其是析构函数,从而让内存的释放可以自动完成,而不是要繁琐地不断手动释放。因此,我们将资源封装到一个类的实例对象时,就实现了资源的自动释放,从而让这个资源对象在离开它的作用域时,可以实现资源的自动释放

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注