• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 程序在debug版不会当,但是release版会当,有哪些原因?

程序在debug版不会当,但是release版会当,有哪些原因?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了debug和release的区别,debug release,vs debug release,c debug release,vs2010 debug release等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 程序在debug版不会当,但是release版会当,有哪些原因?
描述:

程序在debug版不会当,但是release版会当,有哪些原因?


解决方案1:

I. 内存分配问题
1. 变量未初始化。
为debug中会自动给变量初始化found=FALSE,而在release版中
则不会。所以尽可能的给变量、类或结构初始化。
2. 数据溢出的问题
如:char buffer[10];
int counter;
lstrcpy(buffer, "abcdefghik");
在debug版中buffer的NULL覆盖了counter的高位,但是除非counter>16M,什么问题也没
有。但是在release版中,counter可能被放在寄存器中,这样NULL就覆盖了buffer下面
的空间,可能就是函数的返回地址,这将导致ACCESS ERROR。
3. DEBUG版和RELEASE版的内存分配方式是不同的 。如果你在DEBUG版中申请
ele 为 6*sizeof(DWORD)=24bytes,实际上分配给你的是32bytes(debug版以32bytes
为单位分配), 而在release版,分配给你的就是24bytes(release版以8bytes为单位
),所以在debug版中如果你写ele[6],可能不会有什么问题,而在release版中,就有A
CCESS VIOLATE。
II. ASSERT和VERIFY
1. ASSERT在Release版本中是不会被编译的。 
假如你在这些语句中加了程序中必须要有的代
码
比如
ASSERT(pNewObj = new CMyClass);
pNewObj->MyFunction();
这种时候Release版本中的pNewObj不会分配到空间
所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。这时可以用VERIFY 
III. 参数问题:
自定义消息的处理函数,必须定义如下:
afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);
返回值必须是HRESULT型,否则Debug会过,而Release出错 
IV. 内存分配
保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个D
LL同时应该提供一个函数销毁这些数据。数据的创建和清除应该在同一个层次上。
V. DLL的灾难
人们将不同版本DLL混合造成的不一致性形象的称为 “动态连接库的地狱“(DLL Hell) 
如果你的程序使用你自己的DLL时请注意:
1. 不能将debug和release版的DLL混合在一起使用。debug都是debug版,releas
e版都是release版。
解决办法是将debug和release的程序分别放在主程序的debug和release目录下
2. 千万不要以为静态连接库会解决问题,那只会使情况更糟糕
VI. RELEASE板中的调试 :
1. 将ASSERT() 改为 VERIFY() 。找出定义在"#ifdef _DEBUG"中的代码,如果
在RELEASE版本中需要这些代码请将他们移到定义外。查找TRACE(...)中代码,因为这些
代码在RELEASE中也不被编译。 请认真检查那些在RELEASE中需要的代码是否并没有被便
宜。
2. 变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间
都存在这样的差异,所以请对变量进行初始化。
3. 是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没
有警告出现.
VII. 将Project Settings" 中 "C++/C " 项目下优化选项改为Disbale(Debug)。编
译器的优化可能导致许多意想不到的错误,请参考http://www.pgh.net/~newcomer/deb
ug_release.htm
1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动:
在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"D
ebug Info"设置为 "Program Database"。
在"Link"项目下选中"Generate Debug Info"检查框。
"Rebuild All"
如此做法会产生的一些限制:
无法获得在MFC DLL中的变量的值。
必须对该软件所使用的所有DLL工程都进行改动。

解决方案2:

那是因为析构次序可能有问题,你在OnDestroy函数里写过程序吗?贴出来看看。
也可尝试把你写的程序段放在调用父类的OnDestroy函数的前面。


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Debug版本出错Release版本运行正常是怎么回事?
  • WM_NCMOUSEMOVE消息在Release和Debug版本下出现不同现象
  • 使用COM时编译时通过,DEBUG运行不了,RELEASE可以运行!
  • Debug和Release版本编译问题急!急!急!急!
  • Debug版ATL可用regsvr32正常注册,而Release版注册失败,为什么?
  • 串口程序debug版正常,release版读不出数据
  • debug可以通过运行,release为什么不行?
  • MFCActiveX在Release时报错未能注册输出,但是DEBUG下正常
  • 关于Debug和Release编译出错问题
  • 在Debug下没有问题,Release下出错

相关文章

  • 2017-06-05 ExitThread到底应该怎么用呢?
  • 2017-06-05 用c++编的程序如何改成多线程?
  • 2017-06-04 DirectSound流式Buffer一直想不通的问题
  • 2017-06-04 请问在IDL中可以使用STL吗?ATL中的替代类的效率如何?
  • 2017-06-04 Net注册Com组件遇到问题
  • 2017-06-04 如何用程序控制Deskband的显示和隐藏?
  • 2017-06-04 vc做数据库报表应该用什么控件?怎样实现c/s模式?请高手帮忙
  • 2017-06-04 如何隐藏接口函数
  • 2017-06-04 调用word的问题(解决了多给分)
  • 2017-06-05 调用ATL为什么接口指针对象是空的?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 求vc60filter使用方法
    • 请问:有没有介绍用VC++实现COM的好书,谢谢推荐
    • graphEdit中UsesCompressionManagerACM/ICM是什么意思??
    • 请教功能较多的软件,界面,以及内部逻辑组织方式?
    • 求助。。。。水晶报表显示
    • 如何用HOOK监视另外一个程序的所有消息
    • COM初学问题,关于连接点编程
    • 如何将struct转成VARINAT类型
    • VC+ADO下连接并操作sql2005数据库方法总结
    • 请问怎样启动ie浏览一个网页,并且打开新的ie窗口,使用当前ie窗口?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有