使用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);
使用C++11新特性来实现RAII进行资源管理的更多相关文章
- [转载] C++11新特性
C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...
- C++ 11学习和掌握 ——《深入理解C++ 11:C++11新特性解析和应用》读书笔记(一)
因为偶然的机会,在图书馆看到<深入理解C++ 11:C++11新特性解析和应用>这本书,大致扫下,受益匪浅,就果断借出来,对于其中的部分内容进行详读并亲自编程测试相关代码,也就有了整理写出 ...
- C++11新特性总结 (二)
1. 范围for语句 C++11 引入了一种更为简单的for语句,这种for语句可以很方便的遍历容器或其他序列的所有元素 vector<int> vec = {1,2,3,4,5,6}; ...
- C++11新特性总结 (一)
1. 概述 最近在看C++ Primer5 刚好看到一半,总结一下C++11里面确实加了很多新东西,如果没有任何了解,别说自己写了,看别人写的代码估计都会有些吃力.C++ Primer5是学习C++1 ...
- C++ 11 新特性
C++11新特性: 1.auto 2.nullptr 3.for 4.lambda表达式 5.override ...
- 在C++98基础上学习C++11新特性
自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...
- C++11新特性——range for
很多编程语言都有range for语法功能,自C++11起,终于将这个重要功能加入C++标准中.range for语句,可以方便的遍历给定序列中的每个元素并对其执行某种操作. 1.基本语法 for(d ...
- C++11新特性——大括号初始化
C++11之前,C++主要有以下几种初始化方式: //小括号初始化 string str("hello"); //等号初始化 string str="hello" ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
随机推荐
- odoo 开发 context 上下文的用法
context 这是一个上下文,运用很灵活 得到整个context self.context_get() self.env['res.users'].context_get() 得到cont ...
- odoo 的一些orm 操作
1.基础文件及目录结构 在认识odoo ORM框架前,先介绍一下odoo中模块目录结构. data:存放模块预制数据 i18n:存放国际化文件 models:存放模型等py代码 securit ...
- 在MonoGame中SetRenderTarget会把后备缓冲区清除的解决方法
在MonoGame中SetRenderTarget会把后备缓冲区清除的解决方法: 在构造函数中添加事件:graphics.PreparingDeviceSettings += Graphics_Pre ...
- 3-----Docker实例-安装MySQL
Docker 安装 MySQL 方法一.docker pull mysql 查找Docker Hub上的mysql镜像 runoob@runoob:/mysql$ docker search mysq ...
- Dubbo的Api+Provider+Customer示例(IDEA+Maven+Springboot+dubbo)
项目结构 dubbo-demo dubbo-api:提供api接口,一般存储实体类和接口服务 dubbo-provider:dubbo生产者提供服务,一般存储接口具体实现 dubbo-customer ...
- vue 初步了解provide/inject
provider/inject:简单的来说就是在父组件中通过provider来提供变量,然后在子组件中通过inject来注入变量. 需要注意的是 provide / inject这对选项需要一起使用, ...
- Spring异常:Annotation-specified bean name.. for bean class ...
Spring重命名问题.对照项目中的注解,查找@Service是否重重名.由于Spring是在注解下按配置扫描的方式去创建对象的,那么两个重名的注解也就不成立了. 备注,特别注意test包下有没有通过 ...
- chrome浏览器开发者工具(一)
一.Elements 在Element中主要分两块大的部分:HTML结构面板和操作dom样式.结构.时间的显示面板 二.Network Network是一个监控当前网页所有的http请求的面版,它主体 ...
- CentOS6.5安装Mysql数据库
一.卸载原有mysql # rpm -e --nodeps mysql 二.安装mysql # yum install mysql-server mysql mysql-devel 三.查 ...
- Selenium库简介
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击.下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬.对于一些JavaScript动态渲染的页面来说 ...