方法一:借助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);

最新文章

  1. D2js 是如何处理并发的
  2. Java Thread 的使用
  3. Model View Controller
  4. DMA控制
  5. ms sql server 在cmd中执行sqlcmd的时候报错
  6. UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)
  7. Colored Linux Man pages
  8. Android 中Notification的运用
  9. Hibernate4 : 持久化你的第一个类
  10. winform打开本地html页面
  11. C++实现控制台版2048
  12. Ubuntu和ROS一起愉快玩耍
  13. ZH奶酪:Ubuntu 14.04安装LAMP(Linux,Apache,MySQL,PHP)
  14. CSS3_动画 animation
  15. ping vs telnet, what is the difference between them and when to use which?
  16. 保存标注对象到txt 制作xml
  17. window 上安装 Scala
  18. MassTransit入门
  19. Unity中Surface Shader执行过程
  20. scrapy的简单使用

热门文章

  1. Ntp客户端
  2. Emma姐
  3. mkvirtualenv创建python虚拟环境
  4. 【测试的艺术】+测试分析&amp;测试计划+模板
  5. 获取请求Requst中访问请求的客户端IP
  6. CoreJava笔记之线程
  7. python 网络编程——客户端
  8. web_02Java ee实现验证码,网站访问次数功能
  9. Atom编辑器汉化
  10. Require.js 源码分析