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