Chinaunix首页 | 论坛 | 博客
  • 博客访问: 616250
  • 博文数量: 201
  • 博客积分: 3076
  • 博客等级: 中校
  • 技术积分: 2333
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:44
文章分类

全部博文(201)

文章存档

2010年(118)

2009年(83)

我的朋友

分类:

2010-08-20 21:11:23

http://www.cnblogs.com/yuzhengzhe/archive/2005/11/09/272565.html



先来看一小段代码,它取自 Bjarne Stroustrup 的演讲“Speaking C++ as a Native”:

// use an object to represent a resource ("resource acquisition is initialization")

class File_handle { // belongs in some support library
    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
    // copy operations and access functions
};

void f(string s)
{
    File_handle file(s, "r");
    // use file
}

熟悉 C++ 的朋友对这种简称为 RAII 的技巧一定不会陌生。简单的说,RAII 的一般做法是这样的:在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

第一、我们不需要显式地释放资源。以上述代码中的函数 f 为例,我们不必担心“忘记”关闭文件的问题。而且,即使是函数 f 的控制结构发生了改变,例如在函数中间插入 return 或者抛出异常,我们也能确定这个文件肯定会被关闭。特别是在“异常满天飞”的如今,RAII 是实现异常安全的有力武器。类似的,如果某个类 C 包含一个 File_handle 成员,我们也不必担心类 C 的对象会在销毁时“忘记”关闭文件。

第二、采用这种方式,对象所需的资源在其生命期内始终保持有效 —— 我们可以说,此时这个类维护了一个 invariant。这样,通过该类对象使用资源时,就不必检查资源有效性的问题,可以简化逻辑、提高效率。

阅读(1451) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~