RAII

什么是RAII

RAIIResource Acquisition Is Initialization,资源获取即初始化,是C++中很重要的编程思想,它将资源的声明周期和对象的生命周期绑定到一起,在构造函数请求资源,在析构函数释放资源并且绝不抛出异常。
C++中的STL基本都遵循RAII规范,例如vector, string, lock_guard, unique_lock, shared_ptr, unique_ptr等。

ScopeExit

ScopeExit可以在绑定多行代码,在程序离开ScopeExit所在的作用域时,会执行ScopeExit绑定的代码。一般用于绑定资源的清理代码。
例如

1
2
3
4
5
6
7
8
9
10
11
12
13
void test() {​
char *test = new char[100];​
if (a) {​
delete[] test; // count 1​
return;​
}​
xxx;​
if (b) {​
delete[] test; // count 2​
return;​
}​
... delete[] test; // count 3​
}

没有ScopeExit时,我们需要多次手动释放资源,但有了ScopeExit

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void test() {​
char *test = new char[100];​
std::ofstream ofs("test.txt");​
ScopeExit {​
delete[] test; // 在test函数生命周期结束后自动执行delete[]操作​
ofs.close(); // 在生命周期结束后自动关闭文件,这里只是举个不恰当例子,ofstream自动生命周期结束后就会关闭​
};​
if (a) {​
return;​
}​
xxx;​
if (b) {​
return;​
}​
...​
}​

我们只需要用ScopeExit绑定一次资源的清理代码即可。


RAII
https://guts.homes/2025/06/13/cpp-RAII/
作者
guts
发布于
2025年6月13日
许可协议