1 #include <stdio.h> 2 void main() 3 { 4 char *a; 5 try 6 { 7 a=0; 8 (*a)=0; 9 } 10 catch(...) 11 { 12 printf("oops,exception!!\n"); 13 } 14 }
这段代码的运行结果是什么?
你一定会说
"屏幕上打出oops,exception!!\n".
没错,理论上的确是这样.
我们来验证一下,用vc6产生一个空的win32 console工程,
加入上面的cpp文件,
debug方式编译后,得到如期的结果,
但是!
release方式编译后,仍然出现了"访问冲突"!
这如何解释?
本怪兽经调查发现,
VC里缺身编译选项里关于异常的选项是/GX,
文档里说,这等价与/EHs--同步异常捕捉.
何解?
答:只有编译器认为有可能出异常的情况下,
即有throw出现的情况下,
编译器才会生成异常捕捉代码.
据说是VC6的一项新优化功能,
真是自作聪明!谁会希望这样的"异常捕捉"?
解决方法,去掉/GX,加上/EHa--异步异常捕捉.
这样可以保证异常捕捉代码不被"高明"的编译器优化掉.
那为何开头的例子里,debug版本运行正常呢?
答:debug版本不做优化.故正常也.
这是VC6 IDE里非常莫名其妙的地方,
用try catch的人请一定小心.