使用ScopeGuard统一管理系统资源的释放
2016-12-12 00:00
489 查看
#include <algorithm>
#include <functional>
//作用域
class ScopeGuard
{
public:
explicit ScopeGuard(std::function<void()> onExitScope)
: onExitScope_(onExitScope), dismissed_(false)
{}
~ScopeGuard()
{
if(!dismissed_)
onExitScope_();
}
void Dismiss() { dismissed_ = true; }
private:
std::function<void()> onExitScope_;
//允许调用者选择可跳过执行onExitScope();
bool dismissed_;
private:
// noncopyable
ScopeGuard(ScopeGuard const&) = delete;
ScopeGuard& operator=(ScopeGuard const&) = delete;
};
//自动命名, 避免每次都要给class ScopeGuard实例命名的麻烦;
#define SCOPEGUARD_LINENAME_CAT(name, line) name##line
#define SCOPEGUARD_LINENAME(name, line) SCOPEGUARD_LINENAME_CAT(name, line)
#define ON_SCOPE_EXIT(callback) ScopeGuard SCOPEGUARD_LINENAME(EXIT, __LINE__)(callback)
//使用举例
unsigned short Foo(const char *path)
{
FILE *pf = NULL;
//定义Lamda函数来实际释放资源(此例中为文件指针pf);
//如此, 在之后的其他描述中, 无论有无提前结束的情形, 均无需去显式表述pf资源的释放, 即简约又安全;
ON_SCOPE_EXIT( [&] () { if(pf) fclose(pf); } );
if(xxx) {
...
return -1;
}
...
if(yyy) {
...
return -2;
}
...
return 0;
}
注意, 需要c++11支持, 编译时使用-std=c++11参数;
#include <functional>
//作用域
class ScopeGuard
{
public:
explicit ScopeGuard(std::function<void()> onExitScope)
: onExitScope_(onExitScope), dismissed_(false)
{}
~ScopeGuard()
{
if(!dismissed_)
onExitScope_();
}
void Dismiss() { dismissed_ = true; }
private:
std::function<void()> onExitScope_;
//允许调用者选择可跳过执行onExitScope();
bool dismissed_;
private:
// noncopyable
ScopeGuard(ScopeGuard const&) = delete;
ScopeGuard& operator=(ScopeGuard const&) = delete;
};
//自动命名, 避免每次都要给class ScopeGuard实例命名的麻烦;
#define SCOPEGUARD_LINENAME_CAT(name, line) name##line
#define SCOPEGUARD_LINENAME(name, line) SCOPEGUARD_LINENAME_CAT(name, line)
#define ON_SCOPE_EXIT(callback) ScopeGuard SCOPEGUARD_LINENAME(EXIT, __LINE__)(callback)
//使用举例
unsigned short Foo(const char *path)
{
FILE *pf = NULL;
//定义Lamda函数来实际释放资源(此例中为文件指针pf);
//如此, 在之后的其他描述中, 无论有无提前结束的情形, 均无需去显式表述pf资源的释放, 即简约又安全;
ON_SCOPE_EXIT( [&] () { if(pf) fclose(pf); } );
if(xxx) {
...
return -1;
}
...
if(yyy) {
...
return -2;
}
...
return 0;
}
注意, 需要c++11支持, 编译时使用-std=c++11参数;
相关文章推荐
- 统一资源管理与调度平台(系统)介绍
- 统一资源管理与调度平台(系统)介绍
- 如何使用 CGroup 管理系统资源
- Oracle 学习笔记4 —— 使用profile管理系统资源
- 统一资源管理与调度平台(系统)介绍
- Spring Cloud版——电影售票系统<六>使用 Spring Cloud Config 统一管理微服务配置
- Linux硬件资源管理与外设设备使用、系统运行机制及用户管理
- 统一资源管理与调度平台(系统)介绍
- 使用注册表创建统一的呼叫中心配置管理系统
- 统一资源管理与调度平台(系统)介绍
- Libral:一个提供资源和服务统一管理 API 的系统管理库
- 自动资源释放-使用对象管理资源,解决资源泄露问题
- 统一资源管理与调度平台(系统)介绍
- 使用CAS在Tomcat中开发统一用户管理系统
- Yarn---统一资源管理系统
- Android中使用ContentProvider管理系统资源的实例
- 使用 PAM 集成 OpenLDAP 实现 Linux 统一管理系统用户
- 使用VisualNet光纤资源管理系统的投资效益
- 使用VisualNet制作通信资源管理系统效益分析
- 统一资源管理与调度平台(系统)介绍