使用C++11实现完美资源管理
2014-04-16 21:23
344 查看
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谈到了这种方法)
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新特性来实现RAII进行资源管理
- c++11 条款19:使用std::shared_ptr来进行共享所有权的资源管理
- 使用Asset Pipeline管理rails生产环境静态资源实现步骤
- c++11 利用智能指针实现自动资源管理
- 使用jsp标签和java资源管理实现jsp支持多语言
- c++11 条款18: 使用std::unique_ptr来进行独享所有权的资源管理
- Android Studio导入第三方包(资源)方法,ViewPager+TabLayout的使用,ViewPager单独使用实现无限循环
- 使用jQuery.form插件,实现完美的表单异步提交
- Eclipse使用Git代替CVS与SVN实现版本管理
- WebAPI2使用Autofac实现IOC属性注入完美解决方案
- 文件资源使用Texture管理cocosBuilder项目资源:纹理文件使用(TexturePacker)
- 完美实现GIF动画缩略图(GIF压缩使用C++、shell命令、php)
- java使用资源文件实现程序的国际化
- 使用php完成一个用户注册以及管理的demo(php实现单文件与多文件的上传)
- 使用python实现一个简单的学生信息管理系统
- 后台调用外部程序的完美实现(使用CreateDesktop建立隐藏桌面)
- 使用Cloudsim实现基于多维QoS的资源调度算法之一:配置Cloudsim环境
- cocos2d-x使用AssetsManager类实现资源的在线更新
- 使用单个innodb表,实现锁,防止游戏被刷物品或者其它资源!
- VisualNet广电网络资源管理使用经验