C++(六): RAII机制(资源获取初始化)

文章目录

  • 一、RAII介绍与实例


一、RAII介绍与实例

RAII机制,即Resource Acquisition Is Initialization(资源获取初始化)是C++中重要的一种机制,也是C++程序员必须要掌握的基本功之一,其涉及到在类的构造中申请资源,然后使用资源,最后在析构函数中释放资源。

资源指的是诸如内存,文件描述符,socket以及数据库连接等,在程序中申请完了这些资源后利用完之后必须要归还给系统。 一种方式是通过new操作符在堆中创建对象,那么就需要程序员手动delete对象,如果程序因为某些错误而无法delete对象,则有可能对系统造成未定义的行为,内存等部分资源就会永久丢失。

比如,下图是一个未使用RAII的操作:

std::mutex m;
void bad()
{
m.lock();
f(); //如果f爆出异常,那么互斥信号量m永远不会被释放
if(!everything_ok())return; //如果这里直接返回了,互斥信号量m也永远不会被释放
m.unlock();
}

我们可以看到,上述程序中无论哪一步操作失败都要自己释放资源,如果使用了RAII则不需要自己关闭文件,而是在离开函数的时候,会自动释放文件描述符。

下例是一个使用RAII机制的代码示例:

void good()
{
std::lock_guard<std::mutex> lk(m); //RAII类: 互斥体的请求即是初始化
f();
if(!everything_ok())return; //提前返回,互斥体被释放
}

RAII的总结如下:

  1. 将每一个资源封装到一个类中
  2. 这个类中的构造函数请求资源,并建立所有类不变式,或者在它无法完成的时候抛出异常。
  3. 析构函数释放资源并且绝不抛出异常
  4. 始终经由RAII类的实例使用满足要求的资源,该资源自身拥有自动存储期或者临时生存期,或者具有和自动或临时对象的生存期绑定的生存期。

你可能感兴趣的:(C++,c++,开发语言)