C++学习笔记(35):RAII

0 阅读2分钟

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不同应用场景的精简示例

  1. 智能指针( unique_ptr )示例

cpp

#include <memory>

void func() {
    // 构造时获取内存资源
    std::unique_ptr<int> ptr(new int(10));
    // 使用资源
    *ptr = 20;
    // 函数结束时,ptr自动析构,释放内存
}
 

 

  1. 锁管理( lock_guard )示例

cpp

#include <mutex>

std::mutex mtx;

void func() {
   // 构造时加锁
   std::lock_guard<std::mutex> lock(mtx);
   // 临界区操作
   // 函数结束时,lock自动析构,解锁
}
 

 

  1. 自定义 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自动析构,关闭文件
}
 
 
 
  1.  unique_lock 示例(支持手动控制)

cpp

#include <mutex>

std::mutex mtx;

void func() {
    std::unique_lock<std::mutex> lock(mtx);
    // 临界区操作
    lock.unlock(); // 手动解锁
    // 非临界区操作
    lock.lock();   // 手动加锁
    // 再次进入临界区
} // 函数结束时自动解锁
 

以上是RAII不同应用场景的精简示例,涵盖智能指针、锁管理、自定义资源管理类,核心都是通过对象生命周期自动管理资源