870920 Menu

SwingCoder之C++备忘录·24

RAII详解

RAII:Resource Acquisition Is Initialization,资源获取即初始化(以初始化的方式获取资源)。即:使用对象来代表或管理资源,利用C++对象生命期的概念控制资源的获取和释放,将资源的生命期和对象的生命期紧密关联到一起。如需要某种资源(内存、缓冲区、文件句柄、网络连接等等),则创建一个代表该资源的RAII类的对象即可。步骤有三:

 自定义类,代表所要管理的资源。

 自定义基于RAII技术的类,负责管理资源类的对象(指针)。

 使用时,创建RAII类的栈对象。

示例:
class Resource { // … }; // 该类代表原始资源
class ResourceRAII // 该类基于RAII技术使用资源Resource
{
public:
// 构造函数获取资源
explicit ResourceRAII (Resource* resource) : r (resource) {}
~ResourceRAII() { delete r; }; // 析构函数释放资源
Resource* getResource() const { return r; } // 访问资源
private:
Resource* r; // 本类所持有的资源
void* operator new (size_t); // 禁止创建本类的堆对象
void operator delete (void*); // 禁止销毁本类的堆对象
// 本类无需拷构与赋值
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ResourceRAII)
};

使用时,创建ResourceRAII类的栈对象,而不要(也无法)new堆对象。创建对象即拥有资源,该对象离开作用域时,自动释放资源。