C++11的资源管理:泛化的RAII

RAII被认为是c++资源管理的最佳范式,但是c++98中用RAII必须为要管理的资源写一个类,这样一来RAII的使用就有些繁琐了。C++11有了lambda和function后,我们就可以编写泛化的RAII,实现ScopeGuard,优雅地解决这个问题。本文主要参考刘未鹏的博客

主要代码如下

class ScopeGuard
{
public:
    explicit ScopeGuard(std::function<void()> onExitScope)
        : onExitScope_(onExitScope), dismissed_(false)
    { }

    ~ScopeGuard()
    {
        if (!dismissed_)
        {
            onExitScope_();
        }
    }

    void Dismiss()
    {
        dismissed_ = true;
    }

private:
    std::function<void()> onExitScope_;
    bool dismissed_;

private: // noncopyable
    ScopeGuard(ScopeGuard const&);
    ScopeGuard& operator=(ScopeGuard const&);
};

为了在管理多个资源时不用花精力想变量名,可以定义几个宏

#define SCOPEGUARD_LINENAME_CAT(name, line) name##line
#define SCOPEGUARD_LINENAME(name, line) SCOPEGUARD_LINENAME_CAT(name, line)
#define ON_SCOPE_EXIT(callback) ScopeGuard SCOPEGUARD_LINENAME(EXIT, __LINE__)(callback)

其中##是连接符,__LINE__是编译器自带的宏,指的是源代码的行号。这样就会自动生成变量名为"EXIT行号"。

应用如下

class A {
public:
    int a;
    A(int i) :a(i) {}
};

void EraseA(A &a)
{
    a.a = 0;
    cout << "eraseA" << endl;
}

int main()
{
    A a(2);
    ON_SCOPE_EXIT([&] { EraseA(a); });
    return 0;
}

程序结束时输出eraseA。

Dismiss()函数作用是为了支持rollback模式,例如:

ScopeGuard onFailureRollback([&] { /* rollback */ });
... // do something that could fail
onFailureRollback.Dismiss();

如果“do something”的代码出错,就执行析构函数中的rollback逻辑。如果代码顺利运行,就将dismissed_设为true,这样在退出作用域时就不会执行rollback操作了。

lambda表达式用于创建匿名函数对象语法格式如下

[捕获列表] (函数参数) mutable或exception声明 ->返回类型 {函数体};

捕获列表是一个lambda所在函数中定义的局部变量的列表,可以为空,上文的[&]表示默认使用引用传值,如果用[=]则表示默认使用值传递。

最简单的使用方法如下

auto f = [] {return 42;}
cout<<f()<<endl;

结果打印42。

时间: 2024-10-06 13:42:17

C++11的资源管理:泛化的RAII的相关文章

使用C++11新特性来实现RAII进行资源管理

方法一:借助auto.decltype.unique_ptr.Lambda表达式构造 sqlite3 *db = NULL; auto deleter = [](sqlite3 *pdb){sqlite3_close(pdb);} int nRet = sqlite3_open16(L"F:\\my.db",&db); std::unique_ptr<sqlite3,decltype(deleter)> pdb(db,deleter); if(nRet) {//失败

C++11之资源管理(一)

资源管理一直是C++被其他语言(例如Java)诟病的地方.不可否认,垃圾回收是更为先进而且便捷有效的管理资源的手段,并且由于其内在的算法改进,它的速度和效率也在逐步提升.但是,毕竟垃圾回收使得程序员离系统内部又远了一步,不但使得程序员对程序内部发生的事情更加不了解(这也是我学了Java却不喜欢使用的原因),而且需要额外运行垃圾回收这段程序,其速率肯定不如自己手动管理好. 随着C++11的推广,资源管理早已不是那么困难(C++11之前也能使用Boost库达到这种效果),new/delete这么难搞

高效effective C++ 55条款之个人学习笔记二

条款11:在operator=里面处理自我赋值 该条款确保对象自我赋值的时候operator=有很好的行为,必须对对象进行判断,比较.注意Copy and swap技术, 还有注意当函数操作多个对象的时候,也能对其进行判断. 条款12: 复制对象的时候勿忘其每一个成分 对于对象的复制我们必须要保证其完整性,那么关键地方就在于copy构造和=赋值操作的时候,必须做到每个数据 成员全部复制到新的对象.特别注意当继承子类复制的时候,必须将父类每个成员考虑到,两种方式考虑,一种 记得加上初始化父类成员列

c语言函数的嵌套使用和矩阵运算

这段时间,听刚刚学习c++的同学说函数嵌套运用不太熟练,想做一个简单的程序进行练习,我也就当练练手了,哈哈.虽然说是比较简单,但是其中的思维也是值得思考的. 一.函数的嵌套使用 简单说明题目:对于等式 y=x-x^3/3!+x^5/5!+.... 输入任意的x和分母,求得上等式 当然可以找规律,比如分母是(2*n-1)的阶乘,但是我在这里只是介绍最直白的方法 看代码: 1 #include<stdio.h> 2 #include<math.h> 3 4 int factorial(

ASP.NET通用权限框架 权限管理系统源码jquery 精美UI源码

开发工具 VS2010 .sql2005.2008等(在Sql server数据执行脚本即可)  VS2010 打开保证本地运行成功(数据库.源代码)  设计结构采用标准三层设计,是一套非常成熟的框架程序,可直接用于大型系统基础框架快速开发,及程序员学习. 1.菜单导航管理 2.操作按钮 3.角色管理 4.部门管理 5.用户管理(用户权限) 6.用户组管理(设置成员,用户组权限) 7.系统配置(动态配置系统参数) 8.附加属性(自定义属性) 9.系统日志(异常记录) 10.数据库备份/还原 11

C++ 内存泄漏

1. 内存泄漏: 在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况. 内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费. C/C++由于灵活.高效的优点一直以来都是主流的程序设计语言之一,但是其没有垃圾回收机制,内存的分配与释放均由程序员自己管理,当由于疏忽或错误造成程序未能释放不再使用的内存时就会造成内存泄漏. 在大型.复杂的应用程序中,内存泄漏往往是最常见的问题,因

黑马程序员 Java SE回顾

----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- Java SE基础回顾 1.循环语句中的break是终止全部循环,跳出循环体:而continue是终止本次循环,跳执行下一循环 2.return语句有两个作用:返回值:结束方法的运行 3.对于java中面向对象的理解:以类的方式组织代码,以对

Hadoop2.2.0伪分布式之MapReduce简介

一概念. mapReduce是分布式计算模型.注:在hadoop2.x中MapReduce运行在yarn上,yarn支持多种运算模型.storm.spark等等,任何运行在JVM上的程序都可以运行在yarn上. MR有两个阶段组成,Map和Reduce,用户只需要实现Map()和reduce()两个函数(且这两个函数的输入和输出均是key -value的形式)即可实现分布式计算.代码示例略. MapReduce设计框架: 在1.0中:,管理者:Job Tracker:被管理者:Task Trac

c++ 书籍(zz)

 From:http://blog.csdn.net/is2120/article/details/44317241 下面是转载的在博客上看到的一个C++书籍阅读清单,可以参考下: 阶段 1 <Essential C++> 这是一本内容不多但很实用的C++入门书籍,强调快速上手与理解C++编程.本书主要围绕一系列逐渐复杂的程序问题,以及用以解决这些问题的语言特性展开讲解.你不只学到C++的函数和结构,也会学习到它们的设计目的和基本原理. <C++ Primer> 本书对C++基