五种RAII资源管理方案:一、std::unique_ptr定制删除器自动释放C风格资源;二、ResourceGuard模板类零侵入封装获取/释放逻辑;三、std::shared_ptr配合自定义删除器实现引用计数型资源管理;四、ScopeGuard仿函数类在作用域退出时执行任意清理;五、ResourceBase继承体系通过虚析构与纯虚release支持多态资源管理。

一、使用std::unique_ptr封装资源指针
通过std::unique_ptr的定制删除器机制,可在对象析构时自动调用用户指定的释放函数,从而将C风格资源管理逻辑封装进RAII生命周期中。
1、定义资源类型别名,例如using FileHandle = FILE*;
2、声明unique_ptr并绑定自定义删除器:std::unique_ptr
3、在作用域结束时,unique_ptr自动调用lambda删除器,确保fclose被无条件执行。
立即学习“C++免费学习笔记(深入)”;
二、编写通用RAII模板类ResourceGuard
ResourceGuard模板接受资源类型、获取函数、释放函数作为模板参数,在构造时调用获取函数,在析构时调用释放函数,实现零侵入式资源封装。
1、定义模板类:template
2、在构造函数中执行T handle = Acquire(); 并保存handle成员变量;
3、在析构函数中执行if (handle) Release(handle);
4、提供get()方法返回当前资源句柄,禁止拷贝但允许移动以维持独占语义。
三、基于std::shared_ptr实现引用计数型RAII包装
当多个对象需共享同一资源且要求资源在其所有持有者均销毁后才释放时,可利用std::shared_ptr的控制块存储自定义删除器与资源状态。
1、分配原始资源指针,如HANDLE h = CreateEvent(nullptr, TRUE, FALSE, nullptr);
2、构造shared_ptr:std::shared_ptr
3、每次拷贝shared_ptr时,引用计数递增;最后一次析构时自动触发CloseHandle调用。
四、使用作用域守卫ScopeGuard仿函数类
ScopeGuard不持有资源本身,而是在构造时注册一个可调用对象,并在析构时执行它,适用于需在作用域退出时执行任意清理逻辑的场景。
1、定义类模板:template
2、在函数开头声明:auto guard = ScopeGuard([]{ cleanup_resources(); });
3、若函数提前return或抛出异常,guard析构必然触发cleanup_resources调用。
五、继承式RAII基类ResourceBase抽象封装
通过虚析构与纯虚释放函数定义接口契约,派生类强制实现具体释放逻辑,支持多态资源管理容器。
1、声明基类:class ResourceBase { public: virtual ~ResourceBase() { release(); } protected: virtual void release() = 0; };
2、派生类重写release(),例如class FileResource : public ResourceBase { FILE* fp_; void release() override { if (fp_) { fclose(fp_); fp_ = nullptr; } } };
3、将派生类对象存入std::vector<:unique_ptr>>,容器析构时自动多态调用各子类release实现。


















