zoukankan      html  css  js  c++  java
  • 使用C++11实现完美资源管理

    1.资源管理包括内存管理、文件句柄等等需要进行打开(申请)、关闭(释放)操作的过程

    2.VS2010使用的C++规范,严格说来不是C++11,而是C++0x,但是一脉相承的

    一:管理数组

    相较于auto_ptr,unique_ptr的增强点之一是支持对数组对象指针的管理,比如:

    struct A
    {
        int m_data;
        A(int n=0){m_data =n;cout<<n<<" 被构造了"<<endl;}
        ~A(){cout<<m_data<<" 被销毁了"<<endl;}
        void Set(int n){m_data=n;
    };

    auto_ptr<A> p1(new A[5]);//由于自动释放时,只调用delete,所以会导致A[0]以后对象的析构函数不会被调用。对于需要在析构函数中释放资源的对象来说,是不能接受的。

    unique_ptr<A[]> p2(new A[5]);//这样,在释放p2时,会使用delete [].

    二:管理资源

    在上一篇中,使用了sqlite:

    sqlite3 *db = NULL;

    //其他操作

    sqlite3_close(db);

    还有:

    sqlite3_stmt *pstmt=NULL;

    //其他操作

    sqlite3_reset(pstmt);或者sqlite3_finalize(pstmt);

    使用智能指针或其他wrapper类管理资源,主要是
    1.方便省事,最重要的是,避免资源泄露、未释放

    2.应对可能出现的异常.异常出现时,可以自动释放资源,这就是所谓异常安全编程的三个条件之一(能释放资源;能释放资源且保证资源在异常前后状态一致;不抛出异常).另一方面,也可以使得代码美观简洁,否则为对付异常,不得不使用大堆大堆的if…else…

    下面具体来看:

    借助于C++11(C++0x)新引入的auto、decltype、匿名函数对象(Lambda表达式)等特性,我们可以方便进行资源管理:

    sqlite3 *pdb = NULL;

    auto deleter = [](sqlite3 *pdb){sqlite3_close(pdb);}

    int nRet =  sqlite3_open16(L"F:\my.db",&db);

    std::unique_ptr<sqlite3,decltype(deleter)> pdb(pdb,deleter);

    if(nRet)

    {//失败,但是这里不用担心资源管理了

    }

    else

    {

    }

    //其他操作

    //结束前,会动释放资源

    这样,其他的各类资源:User对象HWND,GDI对象HBRUSH,Kernel对象HANDLE等,都可以用此方法进行资源管理,凡此种种,可以自由发挥。哈哈,妈妈再也不用担心我申请资源不释放了!

    下一篇,也许可以谈谈借助于11里面的bind和function,利用stratgy模式,实现虚函数的效果。(Effective C++有个Item谈到了这种方法)

  • 相关阅读:
    apache phoenix查询缓慢问题
    hbase replication原理分析
    ServerSocketChannel实现多Selector高并发server
    hbase hmaster故障分析及解决方案:Timedout 300000ms waiting for namespace table to be assigned
    mapreduce出现类似死锁情况
    【转】How-to: Enable User Authentication and Authorization in Apache HBase
    最近的一些杂念思考
    我究竟该成为什么样的一个人
    解决linux下 使用netcore生成图片报错的问题:The type initializer for 'Gdip' threw an exception
    linux 编译安装nginx
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/3669503.html
Copyright © 2011-2022 走看看