zoukankan      html  css  js  c++  java
  • 使用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)
    {//失败,但是这里不用担心资源管理了
    }
    else
    {
    }
    //其他操作
    //结束前,会动释放资源

    方法二:借助auto、decltype、bind/function、Lambda表达式构造

    定义:

    class ResourceGuard
    {
    private:
        std::function<void()> m_funcOnExit;
    private:
        ResourceGuard(const ResourceGuard&);
        ResourceGuard &operator=(const ResourceGuard&);
    public:
        explicit ResourceGuard(function<void()> _func):m_funcOnExit(_func)
        { }
        ~ResourceGuard()
        {
            m_funcOnExit();
        }

    };
    #define GUARD(callable) ResourceGuard guard__LINE__(callable)

    使用:

        HANDLE hFile= ::CreateFileW(L"F:\a.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,NULL);

        GUARD ([&]() {if (hFile != INVALID_HANDLE_VALUE)
        {
            CloseHandle(hFile);
            hFile = INVALID_HANDLE_VALUE;}
        });

    或:
        hFile = ::CreateFileW(L"F:\a.txt",GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,
    FILE_ATTRIBUTE_NORMAL,NULL);


        auto file_closer = [](HANDLE hFile){
            if(hFile != INVALID_HANDLE_VALUE)
            {
                cout<<"Open File Succeeded! Now Close it With Lambda expression!"<<endl;
                CloseHandle(hFile);
                hFile = INVALID_HANDLE_VALUE;
            }};
        std::unique_ptr<void,decltype(file_closer)> hFer(hFile,file_closer);


  • 相关阅读:
    node-log4js3.0.6配置
    MySQL命令学习
    64位 windows10,MYSQL8.0.13重置密码(忘记密码或者无法登录)
    64位 windows10,安装配置MYSQL8.0.13
    vscode切换界面布局
    一个网站同时监听两个端口
    javascript +new Date()
    es6 解构
    react列表数据显示
    访问禁止,检测到可疑访问,事件编号
  • 原文地址:https://www.cnblogs.com/qinfengxiaoyue/p/3835313.html
Copyright © 2011-2022 走看看