让人崩溃的微软Release编译优化

             搞了几年的编程,一直都在使用try...catch语句,却从来没想到,原来这些语句都是白用了。

       最近做了一个项目,需要根据try...catch是否捕获到异常来作出选择,执行不同的操作。在Debug下执行一切正常,有异常的时候也能够捕获到,从而选择正确的路径执行,但是编译成Release版后有异常时始终不能捕获到,致使执行出错,找了好久也没找出是什么原因。

       后来上网搜索才发现,原来问题出在微软的VC编译器的优化上:在Debug下代码未进行优化,所以没有问题,异常会被捕获。但在Release方式下如果选择default,不进行代码优化,则不会出错,但是代码的速度,效率和尺寸都比较差了,如果选择了编译器代码优化选项,则VC编译器会去搜索try块中的代码, 如果没有找到throw代码, 他就会认为try catch结构是多余的, 给优化掉。 这样造成在Release模式下,try语句中的异常不能被捕获,从而迫使程序弹出错误提示框退出。
        这个优化功能太整人了,本来写了这个语句就是感觉可能会出现异常,需要捕获异常的,结果发布时却给你优化掉了,导致错误,让人花费多少时间来查找错误的原因。

        要解决这个问题,只要在C++编译命令行中加入 /EHa 的参数,这样VC编译器就不会把try...catch模块给优化掉了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值