VC中release与debug的区别

工作中,经常会出现软件包发布版之后,会报一些很怪异的现象,在debug版没有什么问题,一到release版上面,有些功能点就会出现报错的现象;通过几次的检查 Debug与Release不同的问题在刚开始编写代码时会经常发生,
下面是几个避免的方面,即使没有这种问题也应注意一下:


1. 注意变量的初始化,尤其是指针变量,数组变量的初始化。

 thing * search(thing * something)   
 BOOL found;   
 if(found)   
    return whatever[i];   
 else   
   return NULL;

     在debug下运行完美,而在release中却不行,因为debug中会自动给变量初始化found=FALSE,而在release版中则不会。所以尽可能的给变量、类或结构 初始化

变量如果未初始化,  debug下面将每个字节都赋值为0Xcc,而release下是随机的.如果你的变量没有初始化被引用就可能出现异常,所以解决最好的办法就是声名变量是马上初始化,否则后期项目太大,在release下面暴露出来就很难找(建议定义去编译Release去测试,不要最后打包测试再编译,有问题还不急死人!!!

 

数据溢出的问题 

char buffer[10]; 
int counter; 
lstrcpy(buffer, "abcdefghik");

    在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面的空间,可能就是函数的返回地址,这将导致ACCESS ERROR

 

 2. 自定义消息及其他声明的标准写法

 MFC为我们提供了很好的消息机制,增加了自定义消息,但是这种自定义消息也存在Release和Debug的区别.

 例如你定义了一个这样的消息响应函数:

   afx_msg LRESULT OnMessageOwn(); 

在Debug下一般是没有任何问题的,但是在Release下且多线程或者进程的可能导致句柄无效的错误,原因就是消息体缺少参数,正确应该是:

   afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); 

 

3. 使用调试宏时使用后最好注释掉
  ASSERT VERIFY TRACE....调试宏


4. 尽量使用try - catch(...)  

 
5. 尽量使用模块,不但表达清楚而且方便调试。            

                                                 
为什么要区分debug和release版本呢?

它们面向的目标不同的而进行区分的。debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。而release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。所以不保存调试信息,它进行了各种优化,以期达到代码最小和速度最优

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值