C++之RAII学习

C++之RAII惯用法
    1、C++中的RAII全称是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。RAII的好处在于它提供了一种资源自动管理的方式,当产生异常、回滚等现象时,RAII可以正确地释放掉资源。
     RAII的实现原理很简单,利用stack上的临时对象生命期是程序自动管理的这一特点,将我们的资源释放操作封装在一个临时对象中
    代码如下:
    class Resource{};
    class RAII
    {
        public:
        RAII(Resource* aResource):r_(aResource){} //获取资源
        ~RAII() {delete r_;} //释放资源
        Resource* get() {return r_ ;} //访问资源
        private:
        Resource* r_;
    };
    具体参考链接如下: http://blog.csdn.net/hunter8777/article/details/6327704
    例如文件操作的例子,我们的RAII临时对象类就可以写成:
    class FileRAII
    {    
        public:
        FileRAII(FILE* aFile):file_(aFile){}
        ~FileRAII() { fclose(file_); }//在析构函数中进行文件关闭
        FILE* get() {return file_;}
        private:
        FILE* file_;
    };
    打开文件的例子就可以用RAII改写为:
    void Func()
    {
          FILE *fp;
          char* filename = "test.txt";
          if((fp=fopen(filename,"r"))==NULL)
          {
              printf("not open");
              exit(0);
          }
          FileRAII fileRAII(fp);
          ... // 如果 在使用fp指针时产生异常 并退出
           // 那么 fileRAII在栈展开过程中会被自动释放,析构函数也就会自动地将fp关闭
            // 即使所有代码是都正确执行了,也无需手动释放fp,fileRAII它的生命期在此结束时,它的析构函数会自动执行! 
     }
      它免除了对需要谨慎使用资源时而产生的大量维护代码。在保证资源正确处理的情况下,还使得代码的可读性也提高了不少。
     2、创建自己的RAII类
        一般情况下, RAII临时对象不允许复制和赋值,当然更不允许在heap上创建,所以先写下一个RAII的base类,使子类私有继承Base类来禁用这些操作:
         class RAIIBase
        {
            public:
            RAIIBase(){}
            ~RAIIBase(){}//由于不能使用该类的指针,定义虚函数是完全没有必要的
    
            RAIIBase (const RAIIBase &);
            RAIIBase & operator = (const RAIIBase &);
            void * operator new(size_t size); 
            // 不定义任何成员
        };
        要写自己的RAII类时就可以直接继承该类的实现:
        template<typename T>
        class ResourceHandle: private RAIIBase //私有继承 禁用Base的所有继承操作
        {
         public:
            explicit ResourceHandle(T * aResource):r_(aResource){}//获取资源
            ~ResourceHandle() {delete r_;} //释放资源
            T *get() {return r_ ;} //访问资源
         private:
                T * r_;
        };














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值