VC在debug运行正常,release崩溃的解决办法
--《VC编程知识总结》之三
在调试程序的时候经常遇到一个问题:debug版运行的很正常,查不出任何问题,到了release版,运行一会儿就崩溃了。最近一段时间查了很多资料,终于是找到了原因所在。讲解如下:
遇到这种问题,要查查系统中是否定义了消息捕获和触发函数(我的程序就是这个问题),如果你的程序中没有定义消息,也没有定义消息捕获和触发函数,那就不好意思,我没有遇到这个问题,所以没有研究过,非常抱歉(你可以查看一下,是不是存在未初始化就使用的变量,因为debug中系统会帮助初始化,但release中不会)。如果有定义消息,请查看自己的消息处理函数定义,是不是定义成了afx_msg void OnXXXX(WPARAM wParam, LPARAM lParam),如果定义成这样,那就在消息处理方面不存在我要讲得问题,如果定义成了afx_msg void OnXXXX(),那就按照我说的方法改吧,应该就不会有问题了。
修改方法有两种:
1、将afx_msg void OnXXXX()改为afx_msg void OnXXXX(WPARAM wParam, LPARAM lParam);
2、不修改函数定义,将消息映射表(Map)中的ON_MESSAGE(Message,MemberFunc)改为ON_MESSAGE_VOID(Message,MemberFunc),注意要包含头文件axfpriv.h。
问题原因:当有自定义的消息产生时,系统会调用自定义消息处理函数(就是MemberFunc),系统想当然的认为这个函数有两个参数,分别是WPARAM wParam和LPARAM lParam。系统在调用函数时,会把这两个参数压栈,而函数自身并没有参数。在release优化的情况下,在返回上一级函数时,依据的是这个函数的自动变量,参数等信息,于是这两个参数被系统留了下来,这样就产生了冲突,所以程序就崩溃了。在debug下,每调用一个函数时,系统会把当前函数在堆栈中的位置保存在一个寄存器中(EBP),当函数执行完毕后返回上一级函数时,不会出现release时的冲突,所以不会出现问题。
PS:之前遇到这种问题,也有朋友说修改release的编译参数,去掉优化参数就可以,这个方法确实可以使release版运行正常,但我不建议使用,为了方便大家查找,我也列出来:将Project->Settings->C/C++->Project Options中的/O2改为/Od。