使用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谈到了这种方法)
使用C++11实现完美资源管理的更多相关文章
- [linux]centos7.4上安装MySQL-8.0.11【完美安装】
版本声明 centos7.4 MySQL-8.0.11 1.我用的阿里云的虚拟主机,刚从windows换到linux,需要装下常用工具 #安装下sz rz常用到上传下载的命令 yum install ...
- VMware Workstation 11.0 官方中文版最强虚拟机软件(附下载地址)
VMware Workstation 11.0 新版本功能一览: 支持 Windows 8.1 Update.Windows Server 2012 R2.Ubuntu 14.10.RHEL 7.Ce ...
- VMWare Workstation 11的安装
不多说,直接上干货! 说白了 VMWare Workstation是收费的! VMware Player 和 VirtualBox是免费的! 虚拟机软件可让你在一个操作系统上直接运行的多个不同的虚 ...
- (原创)c++11改进我们的模式之改进命令模式
模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...
- 使用 C++11 编写类似 QT 的信号槽——上篇
了解 QT 的应该知道,QT 有一个信号槽 Singla-Slot 这样的东西.信号槽是 QT 的核心机制,用来替代函数指针,将不相关的对象绑定在一起,实现对象间的通信. 考虑为 Simple2D 添 ...
- 解决学校在线评测系统不支持C++11的问题
如图,我们老师搞的这个评测系统它不支持C++11.但分析错误信息可知GCC本身版本是支持C++11的,只不过没开开.平时的时候我们可以对"g++"后使用"-std=c++ ...
- 职位-CHO:CHO
ylbtech-职位-CHO:CHO 首席人力资源官(Chief Human Resource Officer),简称CHO.是具有制定集团化经营的公司人力资源的战略规划,并监督执行,负责建立畅通的沟 ...
- Speech两种使用方法
COM组件使用speech: public class Speach { private static Speach _Instance = null ; private SpeechLib.SpVo ...
- 第十一篇 SQL Server安全审核
本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...
随机推荐
- am335x uboot启动流程分析
基本指令含义 .globl _start .globl指示告诉汇编器,_start这个符号要被链接器用到,所以要在目标文件的符号表中标记它是一个全局符号 b,bl b是不带返回的跳转 bl带返回的跳 ...
- oracle12c之四 控制PDB操作 PDBLockdown Profiles
除了IO.内存.CPU之外,还有一些限制,比如:限制在pdb中的操作命令,我们可以创建一个lockdown profile来限制对当前PDB的操作,增强某些操作的安全性. 关于PDB Lockdo ...
- saltstack源码详解一
目录 初识源码流程 入口 1.grains.items 2.pillar.items 2/3: 是否可以用python脚本实现 总结pillar源码分析: @(python之路)[saltstack源 ...
- ORC Files
ORC 全称是Optimized Row Columnar,意思是优化的RC file,优化行列式. ORC 文件格式提供了一个很高效的方式来存储hive数据.它旨在克服其他hive文件格式的限制.当 ...
- SpringBoot + Spring MVC国际化使用示例
项目中需要显示中英文两种语言,所以需要对显示的内容进行国际化,如下是一个示例程序. 程序文件结构,如下图,后面详细列出各文件的代码. 1. 编写maven的pom.xml文件,如下: <proj ...
- 生产html测试报告
批量执行完用例后,生成的测试报告是文本形式的,不够直观,为了更好的展示测试报告,最好是生成 HTML 格式的.unittest 里面是不能生成 html 格式报告的,需要导入一个第三方的模块:HTML ...
- Git学习系列之一些常用的Git命令收录更新ing
不多说,直接上干货! 前言 对于Git工具,有必要整理和总结一些常用实用的命令. http://p.primeton.com/articles/53cce3a3e138236138000026 ht ...
- Mybatis Dao开发方法(二)
使用Mapper代理的方式进行开发 Mapper开发的原理 使用Mybatis的Mapper代理方式进行开发,使用该方式,只需要编写Mapper接口,不再需要编写实现类,由Mybatis框架通过接 ...
- [java源码解析]对HashMap源码的分析(一)
最近有空的时候研究了下HashMap的源码,平时我用HashMap主要拿来当业务数据整理后的容器,一直觉得它比较灵活和好用, 这样 的便利性跟它的组成结构有很大的关系. 直接开门见山,先简要说明一下H ...
- codeforces 638B—— Making Genome in Berland——————【类似拓扑排序】
Making Genome in Berland time limit per test 1 second memory limit per test 256 megabytes input stan ...