每天进步一点点——C++11中使用lambda表达式实现一个简单的ScopeGuard

本文详细介绍了如何在C++11中利用lambda表达式实现一个ScopeGuard,探讨了其在确保资源有效管理和异常安全方面的作用。
摘要由CSDN通过智能技术生成

转载请说明出处:http://blog.csdn.net/cywosp/article/details/29585227


1. RAII
    在进入本文主要内容之前先了解一下C++中常用的RAII(Resource acquisition is initialization)技术,即资源获取即初始化。其利用C++对象生命周期的概念来控制 程序的资源,例如内存、文件句柄、网络连接以及审计追踪(audit trail)等。RAII的基本技术原理很简单,若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联,如此一来,就可以利用C++复杂老练的对象管理设施来管理资源。最简单的RAII形式是创建这样一个对象:其构造函数获取一份资源,而析构函数则释放这份资源。在最新的C++标准中有如下数据类型:std::lock_guard、std::unique_lock、std::shared_ptr、std::unique_ptr等等都是RAII技术的很好体现,同时我们也可以自己现实对相关资源的初始化以及释放,例如在多线程编程中我们往往会忘记释放锁而导致线程死锁:
class Mutex 
{
public:
    Mutex () {pthread_mutex_init (&mu_, NULL);}
    ~Mutex () {pthread_mutex_destroy (&mu_);}
    void lock () {pthread_mutex_lock (&mu_);}
    void unlock () {pthread_mutex_unlock (&mu_);}

private:
    pthread_mutex_t mu_;

    // No copying
    Mutex (const Mutex&);
    void operator= (const Mutex&);
};

Mutex lock;
{
    std::lock_guard<Mutex> guard (lock); // lock is locked by guard
    ……
}
// lock is not locked by anyone 
       ……

2. Lambda表达式
C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda的语法形式如下:
    [函数对象参数] (操作符重 载函数参数) mutable或exception声明;返回值类型 {函数体};
可以看到,Lambda主要分为五个部分:[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、返回值类型、{函数体}。下面分别进行介绍。
 一、[函数对象参数],标识一个Lambda的开始,这部分必须存在,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用那些到定 义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式: 
1、[] 没有使用任何函数对象参数。
2、[=] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。
3、[&] 函数体内可以使用Lambda所在作用范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)
4、[this] 函数体内可以使用Lambda所在类中的成员变量。
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值