WEB开发网
开发学院软件开发C语言 RAII 阅读

RAII

 2009-06-08 08:32:23 来源:WEB开发网   
核心提示: 从上面的 File_handle 类可以看出,构造对象的时候,RAII(3),我们初始化非内存资源 FILE,当对象释放时,invariant 的出现,必定带来一个结果:简化编程,FILE 同时被释放,通过 RAII 我们能够将非内存资源生命周期管理转换到内存资源生命周期的管理上来

从上面的 File_handle 类可以看出,构造对象的时候,我们初始化非内存资源 FILE,当对象释放时,FILE 同时被释放。

通过 RAII 我们能够将非内存资源生命周期管理转换到内存资源生命周期的管理上来,那么上面丑陋的代码转化为:

void f()
{   
    autoptr<File_handle> pf1(new File_handle("killercat.blog1", "w"));
    autoptr<File_handle> pf2(new File_handle("killercat.blog2", "w"));
    autoptr<File_handle> pf3(new File_handle("killercat.blog3", "w"));
    // ...   
    try   
    {       
        f2(); // f2 可能抛出异常   
    } catch (const xxx&) {       
        // 资源能够被正确释放   
    }
}

RAII 的实质:

1. 通过把非内存资源的生命周期管理转化为内存资源的生命周期管理,达到对非内存资源的安全释放。

2. 通过维护一个 invariant(对象存在即资源有效),来简化编程。

当然,这里不仅仅可以使用 autoptr 也可以使用 shared_ptr 等智能指针。不过,除此之外,RAII 还维护了一个 invariant --- 对象存在即资源有效,invariant 的出现,必定带来一个结果:简化编程。看下面的例子:

class File_handle
{
    FILE* p;
public:
    File_handle(const char* pp, const char* r)
    {
        p = fopen(pp,r);
        if (p==0)
            throw Cannot_open(pp);
    }
    File_handle(const string& s, const char* r)
    {
        p = fopen(s.c_str(),r);
        if (p==0)
            throw Cannot_open(pp);
    }
    ~File_handle()
    {
        fclose(p);
    } // destructor
 
    int GetChar()
    {
        // 无需检查 p,因为 p 一定有效
        return fgetc(p);
    }
};

上一页  1 2 3 4 5  下一页

Tags:RAII

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接