以前总是听过学习C++ 不知道RAII那就是不合格的c++程序员,那什么是RAII呢?所谓RAII机制就是(Resource Acquisition Is Initialization,资源获取即初始化),在类的构造里申请资源,然后使用资源,最后在析构函数中释放资源。在计算机中有很多种资源,内存是我们经常使用的资源,此外还有文件描述符,socket以及数据库连接等,在程序中申请这些资源后利用完必须归还,否则会造成未定义的行为。如果对象在栈上创建,那么RAII会正常工作,在离开作用域的时候释放资源。如果是使用new操作符在堆上创建对象,那么就需要程序员手动delete对象,如果程序因为某些错误而无法delete对象,则有可能对系统造成未定义的行为,内存等部分资源就会永久丢失。
未使用RAII的操作:
1 | std::mutex m; |
无论那一步操作失败都需要自己释放资源,如果使用了RAII则不需要自己关闭文件,在离开函数的时候,会自动释放文件描述符。
使用RAII机制的代码示例:
1 | void good() |
RAII的总结如下(cppreference):
- 将每个资源封装入一个类,其中
· 构造函数请求资源,并建立所有类不变式,或在它无法完成时抛出异常,
· 析构函数释放资源并决不抛出异常;
- 始终经由 RAII 类的实例使用满足要求的资源,该资源
· 自身拥有自动存储期或临时生存期,或
· 具有与自动或临时对象的生存期绑定的生存期