码迷,mamicode.com
首页 > 其他好文 > 详细

资源管理之finally

时间:2020-04-30 11:57:48      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:struct   析构函数   很多   应该   代码   函数   请求   函数的参数   sizeof   

/*
    为了编写任意代码以在异常发生后执行清理工作,
    人们曾经设计了很多"最终的"语言概念。
    首先我们定义一个类,它在析构函数中执行任意操作。 
*/ 
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!
*/ 
 

 

资源管理之finally

标签:struct   析构函数   很多   应该   代码   函数   请求   函数的参数   sizeof   

原文地址:https://www.cnblogs.com/lhb666aboluo/p/12807456.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!