资源管理之finally

/*
    为了编写任意代码以在异常发生后执行清理工作,
    人们曾经设计了很多"最终的"语言概念。
    首先我们定义一个类,它在析构函数中执行任意操作。 
*/ 
template <typename F>
struct Final_action{
    Final_action(F f): clean{f}{}
    ~Final_action(){ clean();}
    F clean;
}; 
/*
    我们通过构造函数的参数提供"最终操作"。
    接下来定义一个函数,它可以方便地推断某个操作的类型:
*/
template <class F>
Final_action<F> finally(F f)
{
    return Final_action<F>(f);
}
/*
    最后,我们检验finally()的效果:
*/
void test()
//处理非常规的资源请求任务
//该代码证明我们可以在其中嵌入任意操作
{
    int* p = new int{7};    //其实应该使用unique_ptr 
    int* buf = (int*)malloc(100*sizeof(int));   //C风格的资源请求
    
    auto act1 = finally([&]{ delete p;
                           free(buf);           //C风格的资源释放
                           cout << "Goodbye, Cruel world!\n";
                           });
                        
    int var = 0;
    cout << "var = " << var << '\n';
    
    //嵌套的块:
    {
        var = 1;
        auto act2 = finally([&]{ cout << "finally!\n"; var = 7;});
        cout << "var = " << var << '\n';
    }//调用act2 
    
    cout << "var = " << var << '\n';
}//调用act1

/*
    上述代码输出:
    var = 0
    var = 1
    finally!
    var = 7
    Goodbye, Cruel world!
*/ 
 

猜你喜欢

转载自www.cnblogs.com/lhb666aboluo/p/12807456.html