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实现完美资源管理的更多相关文章

  1. [linux]centos7.4上安装MySQL-8.0.11【完美安装】

    版本声明 centos7.4 MySQL-8.0.11 1.我用的阿里云的虚拟主机,刚从windows换到linux,需要装下常用工具 #安装下sz rz常用到上传下载的命令 yum install ...

  2. VMware Workstation 11.0 官方中文版最强虚拟机软件(附下载地址)

    VMware Workstation 11.0 新版本功能一览: 支持 Windows 8.1 Update.Windows Server 2012 R2.Ubuntu 14.10.RHEL 7.Ce ...

  3. VMWare Workstation 11的安装

    不多说,直接上干货! 说白了   VMWare Workstation是收费的! VMware Player 和 VirtualBox是免费的! 虚拟机软件可让你在一个操作系统上直接运行的多个不同的虚 ...

  4. (原创)c++11改进我们的模式之改进命令模式

    模式虽然精妙,却难完美,比如观察者模式中观察者生命周期的问题:比如访问者模式中循环依赖的问题等等:其它很多模式也存在这样那样的一些不足之处,如使用场景受限.实现复杂.不够简洁.不够通用等.但我觉得不足 ...

  5. 使用 C++11 编写类似 QT 的信号槽——上篇

    了解 QT 的应该知道,QT 有一个信号槽 Singla-Slot 这样的东西.信号槽是 QT 的核心机制,用来替代函数指针,将不相关的对象绑定在一起,实现对象间的通信. 考虑为 Simple2D 添 ...

  6. 解决学校在线评测系统不支持C++11的问题

    如图,我们老师搞的这个评测系统它不支持C++11.但分析错误信息可知GCC本身版本是支持C++11的,只不过没开开.平时的时候我们可以对"g++"后使用"-std=c++ ...

  7. 职位-CHO:CHO

    ylbtech-职位-CHO:CHO 首席人力资源官(Chief Human Resource Officer),简称CHO.是具有制定集团化经营的公司人力资源的战略规划,并监督执行,负责建立畅通的沟 ...

  8. Speech两种使用方法

    COM组件使用speech: public class Speach { private static Speach _Instance = null ; private SpeechLib.SpVo ...

  9. 第十一篇 SQL Server安全审核

    本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...

随机推荐

  1. CTF<密码学> writeup 传统知识+古典密码

    小明某一天收到一封密信,信中写了几个不同的年份          辛卯,癸巳,丙戌,辛未,庚辰,癸酉,己卯,癸巳. 信的背面还写有“+甲子”,请解出这段密文. key值:CTF{XXX} 百度可以查到 ...

  2. git泄露利用脚本

    留一下万一之后用得着呢 工作原理 1.解析.git/index文件,找到工程中所有的: ( 文件名,文件sha1 ) 2.去.git/objects/ 文件夹下下载对应的文件 3.zlib解压文件,按 ...

  3. my34_脚本冥等添加自动任务-mysql监控部署

    场景: 定义一套添加mysql监控的脚本,在mysql安装完毕后,一键执行添加监控   已有以下的等一系列命令可以读取mysql从库的延迟时间并推向influxdb,变化的部分为 -P 端口.-k k ...

  4. SPRING中的线程池ThreadPoolTaskExecutor(转)

    转自:https://blog.csdn.net/zhanglongfei_test/article/details/51888433 一.初始化 1,直接调用 ThreadPoolTaskExecu ...

  5. 纯Python给ulaw wav文件加头

    最近在处理wav相关文件,碰见一工具产生的ualw文件不带header,顺手用python给wav格式文件加头处理,让普通播放器也能播放. (原文:http://www.cnblogs.com/ryh ...

  6. 案例16-validate自定义校验规则校验用户名是否存在

    1 知识点 2 register.jsp代码 注意自定义校验规则的时候,提交必须是同步的方式. <%@ page language="java" contentType=&q ...

  7. mvc框架的学习步骤

    1 搭建环境.有个感性认识 2 如何完成controller和viewer的映射 3 如何把值传给controller 4 controller如何把值传给view 5 异常处理 6 页面标签 7文件 ...

  8. linux install oracle jdk

    1 到oracle 官方网站下载jdk1.7 2 然后mv到 /usr/local/目录下 2.1 path 下添加/usr/sbin/ 3 使用update-alternative用来对系统中不同版 ...

  9. ormLite注解小记

    注解是特殊的代码标志已在Java版本开始,要指定什么类和字段存储在数据库中,ORMLite支持其自己的注解(@ DatabaseTable @ DatabaseField)或更多的标准注解从javax ...

  10. 架构实战项目心得(九):后台服务工具ldap:统一用户中心ldap工具使用以及安装

    一.安装OpenLDAP 1.安装 yum -y install openldapopenldap-servers openldap-clients openldap-devel compat-ope ...