在退出作用域时做一些事

Boost.ScopeExit库 

由于种种原因,C++中没有Java或C#中的try{}finally{}语句,虽然有SEH,可以实现finally效果,但是可定制性太差,不尽人意。

SEH实现的finally语句

__try
{
	throw std::bad_exception();
}
__finally
{
	cout << "in finally" << endl;
}

使用Boost.ScopeExit库可以完美实现这一功能,功能类似于Golang的defer关键字

cout << "before boost scope" << endl;
bool bClosed = false;
BOOST_SCOPE_EXIT(bClosed) {
	cout << "in boost scope" << endl;
	bClosed = true;
} BOOST_SCOPE_EXIT_END
bClosed = false;
cout << "after boost scope" << endl;

变量bClosed通过BOOST_SCOPE_EXIT(bClosed)按值传递,当程序离开执行的作用域时,"BOOST_SCOPE_EXIT{"与"}BOOST_SCOPE_EXIT_END"之间的代码将被执行。如果希望按引用传递值,那么要在BOOST_SCOPE_EXIT宏中使用&符号。如果想传递多个值,用逗号将它们分开即可。

查看boost库的源码BOOST_SCOPE_EXIT宏使用_VA_ARGS_不定参收集参数,所以()中的内容,按照不定参函数的参数规则填写即可。

Boost.ScopeExit库不在堆上分配任何额外内存,并且不使用虚函数,所以对程序执行性能没有任何影响。

#include <boost\scope_exit.hpp>

static bool TestScope()
{
	cout << "before boost scope" << endl;
	bool bClosed = false;
	BOOST_SCOPE_EXIT(bClosed) {
		cout << "in boost scope" << endl;
		bClosed = true;
	} BOOST_SCOPE_EXIT_END
	bClosed = false;
	cout << "after boost scope" << endl;
	return bClosed;
}

static void TestSEH()
{
	__try
	{

		throw std::bad_exception();

		cout << "never get here" << endl;
	}
	__finally
	{

		cout << "in finally" << endl;

	}
	cout << "out of finally" << endl;
}
时间: 2024-08-26 06:44:38

在退出作用域时做一些事的相关文章

尽量别做自己不想做的事

愈来愈不懂得客气是怎么一回事儿. 为了礼貌,有时向人说:"有空去饮茶." 这一说不得了了,天天闲着,却又没时间,有空时想想:"值不值得去?" 最后,还是勉强去应酬,深觉没意思. 所以,"有空去饮茶"这句话,少说了.如果没有心的话,说来干什么?自己找辛苦. 吃完饭大家抢着付账,要付就让人家去付好了,已经学会接受这种方式. 最糟糕的是,想请客,先把信用卡交上柜台,但对方坚持要付,把你的卡退回给你.应付这种情形,唯有让他们去结账,再买一份重礼他日送上.

dllmain不能做的事

首先,参看这篇文章: http://msdn.microsoft.com/en-us/library/windows/desktop/dn633971%28v=vs.85%29.aspx loadlibrary时,会先加锁,然后调用dllmain,然后解锁返回. 所以dllmain中,要做的初始化或清理越简单越好.该做的复杂的初始化,应该延迟,在loadlibrary之后. 不能做的事: LoadLibrary CreateThread CreateProcess GetModuleFileNa

林正英僵尸之斗阴阳尸自己想好做的事

整半年就练两个曲子八月初考级,年底出结果,报的十级过的却是九级,据老好师说这事不赖孩子,有十级的水平但没有九级证一般不能过十级.九级就九级,反正学着玩,没当大事办,不再考啦!整天督促他练xí他没兴趣我也烦了.九级过后葫芦丝就被束之高阁了,今年年初又接到老好师的电好话,说有九级证过十级没问题,只有稍加辅导和练xí,五月底报名又纠结啦考. 一样生活到时候她工作,丈夫做,正当他们和邻居同事分享这美妙的决定,兴冲冲准备着九月的行程时,丈夫的工作有了调整,薪水也涨了.过惯平稳生活的男主人改变了主意,对未来

C#捕获windows关机事件,在系统关机前做一些自己想做的事

C#捕获windows关机事件,在系统关机前做一些自己想做的事: 有些时候我们可能想在Windows关机时记录或处理一些事情,这里提供几种方法. 方法一: /// <summary> /// 窗口过程的回调函数 /// </summary> /// <param name="m"></param> protected override void WndProc(ref Message m) { switch (m.Msg) { //此消息

开发完 iOS 应用,接下去你该做的事

iOS专项总结 一个应用经过多次迭代后告一段落,接下去我们在技术上还可以做些什么呢?答案是提高代码的整体质量.关于这方面,除了我们常喊的 重构,测试也非常重要. 博主近期给我们的 iOS客户端代码来了一次专项测试.主要从常规的 辅助测试 入手,来了次代码大清理,找到代码中的问题,并一一改掉它们.惊喜的是,这对于提高本人的代码水平有很大的帮助.其实,这套代码的质量本身已经很高了,也非常整洁.而这主要得益于严格的代码规范和pull request机制. 关于测试,App常关注的往往是一些功能性的,包

日常服务器维护该做哪些事

日常服务器维护该做哪些事?服务器维护是比较头疼的问题,经常会遇到这样或那样的问题:如果公司有运维牛人或托管服务器.租用服务器在个别isp,恭喜你,你很幸运,如果没有,最好要经常备份.检查,避免服务器出现问题时束手无策.下面为大家梳理一下日常服务器维护该做哪些事? 一.了解服务器 知己知彼才能百战不殆,如果对自己维护的服务器都不了解,何以能正确解决服务器宕机.补丁安装,漏洞修复等问题. 1.服务器操作系统类型,版本,补丁版本: 2.服务器硬盘使用率: 3.服务器运行业务的情况: 4.服务器网络配置

优秀程序员一般都会做的事

编程虽是复杂活,但成就优秀程序员的很多因素和我们在学校中最早学到的相差无几. 也许你还刚毕业,对于“优秀程序员”这个词觉得还很遥远,但是,作为程序员,“优秀”是你最起码的目标.本文列出了成为优秀程序员的8件事,希望能给你的职业生涯带来帮助.  (本图为:优秀程序员一般都会做的事之优秀程序员) 给自己确定目标 如果不知道向什么方向发展,是很难有成就的.这一点关键是自己要有一个清晰地目标.这个应该是个长期的目标,然后要有一个目标的愿景.首先要把这个目标分成一些小的任务,建立实现这些目标的路线图.你可

摘抄-----java codeReview要做的事

整洁的代码 清单项目 分类 使用可以表达实际意图(Intention-Revealing)的名称 有意义的名称 每一个概念只用一个词 有意义的名称 使用方案/问题领域名称 有意义的名称 类应该是比较小的! 类 函数应该是比较小的! 函数 只做一件事 函数 DRY(Don’t Repeat Yourself)原则,(拒绝重复) 函数 用代码来解释自己的做法(译者注:即代码注释) 注释 确定应用了代码格式化 格式 使用异常而不是返回码 异常 不要返回Null 异常 *参考自:http://techb

奚恺元《别做傻瓜做的事》

别做傻瓜做的事1 别做傻瓜做的事2 正常人通常有心理账户误区,他们在心里对每一枚硬币并不是一视同仁的,而是视它们来自何方.去往何处而采取不同的态度. 如果你想少几分正常.多几分理性,你应当避免人为地设置心理账户而把不同用途或不同来源的钱割裂开来.你应当让财富在你的心理账户之间相互流通. 正常人通常在拿了一大笔收入的时候不愿意花钱,而在有一笔较小收人的时候反而容易把这笔钱花光. 由于心理账户的存在和效应,在两种等价的情况下正常入往往会做出自相矛盾的判断和决定,离理性有很大的差距:,如何才能改进和避