1.RAII是什么
资源获取就是初始化,本质是让对象生命周期与资源生命周期相等。 在C++中,用对象的生命周期管理资源,构造时获取资源,析构时自动释放,不用手动free/delete/close。
作用:
- 自动管理:内存、文件句柄、锁、套接字等
- 保证异常安全、不泄露 典型例子: std::unique_ptr std::lock_ptr std::fstream
2.smart_pointer
对内存的管理
- unique_ptr
- shared_ptr
- weak_ptr
- RefBase 构造即申请,析构即释放
3.lock_guard
对锁的管理 构造即申请,析构即释放
4.unique_lock
对锁的高级管理需求 在lock_guard的基础上,还能够手动解锁和加锁
5.FileGuard
对文件的管理,自定义类型,看名字是对文件的看守
6.MmapGuard
对内存映射的管理, 自定义类型,看名字是对内存映射的看守
7.OpenGL(特殊领域)
对各种句柄的管理
8.RAII不同应用场景的精简示例
- 智能指针( unique_ptr )示例
cpp
#include <memory>
void func() {
// 构造时获取内存资源
std::unique_ptr<int> ptr(new int(10));
// 使用资源
*ptr = 20;
// 函数结束时,ptr自动析构,释放内存
}
- 锁管理( lock_guard )示例
cpp
#include <mutex>
std::mutex mtx;
void func() {
// 构造时加锁
std::lock_guard<std::mutex> lock(mtx);
// 临界区操作
// 函数结束时,lock自动析构,解锁
}
- 自定义 FileGuard 示例
cpp
#include <fstream>
class FileGuard {
private:
std::ofstream file;
public:
// 构造时打开文件(获取资源)
FileGuard(const char* path) : file(path) {}
// 析构时关闭文件(释放资源)
~FileGuard() {
if (file.is_open()) {
file.close();
}
}
};
void func() {
FileGuard fg("test.txt");
// 使用文件
// 函数结束时,fg自动析构,关闭文件
}
- unique_lock 示例(支持手动控制)
cpp
#include <mutex>
std::mutex mtx;
void func() {
std::unique_lock<std::mutex> lock(mtx);
// 临界区操作
lock.unlock(); // 手动解锁
// 非临界区操作
lock.lock(); // 手动加锁
// 再次进入临界区
} // 函数结束时自动解锁
以上是RAII不同应用场景的精简示例,涵盖智能指针、锁管理、自定义资源管理类,核心都是通过对象生命周期自动管理资源