C++RAII机制

C++RAII机制

概念

  • RAII(Resource Acquisition Is Initialization)机制使用局部对象来管理资源的技术,称之为资源获取即初始化,由C++之父Bjarne Stroustrup提出,是C++中一种管理资源,避免泄漏的机制

  • RAII例子:C++中的lock_guard类就是对互斥锁mutex资源的管理,我们也可以自定义封装一个资源管理模板类

  • RAII实质:其实就是利用栈的资源回收机制以及类对象销毁调用析构函数机制,使用一个局部类对象来管理资源,当函数结束时会将栈中资源回收,这个时候类对象会因为销毁而调用类析构函数,我们只需要在类的析构函数中实现销毁资源的功能,即可隐式回收资源

  • 作用

    1. 可以用一个局部对象管理资源,则资源的生命周期是由操作系统来管理,无需人工介入
    2. 可以避免忘记销毁资源或者程序产生异常和回滚,无法正确释放掉资源,造成死锁或内存泄漏

RAII做法

  1. 在对象构造时申请获取资源
  2. 使用资源
  3. 在对象析构时释放资源

lock_guard类使用示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <thread>
#include <mutex>


int share=0;
std::mutex m;

void foo(){
for(int i=0;i<100000;++i){
/*
m.lock();
//已经加过锁,所以需传入std::adopt_lock变量
std::lock_guard<std::mutex> lg(m,std::adopt_lock);
*/
std::lock_guard<std::mutex> lg(m);
share++;
}
}


int main (int argc, char *argv[]) {
std::thread t1(foo);
std::thread t2(foo);
t1.join();
t2.join();
std::cout<<share<<std::endl;
return 0;
}

自定义封装示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <mutex>


//使用RAII机制对互斥锁的简单管理类
class raii_mx{
public:
raii_mx(std::mutex &mx):_mx(mx){
std::cout<<"mx lock"<<std::endl;
mx.lock();
}
~raii_mx(){
std::cout<<"mx unlock"<<std::endl;
_mx.unlock();
}

private:
std::mutex& _mx;
};


void foo(int x){
std::mutex mx;
raii_mx ramx(mx);
if(x==0){
std::cout<<"foo exception"<<std::endl;
return;
}
std::cout<<"程序成功完成运行"<<std::endl;
return;
}

int main (int argc, char *argv[]) {
foo(1);
foo(0);
return 0;
}

C++RAII机制
https://moonfordream.github.io/posts/C-RAII机制/
作者
Moon
发布于
2024年7月23日
许可协议