VS中的一些应用Debug和Release区别
- 格式:docx
- 大小:21.10 KB
- 文档页数:6
VC编译开关选项分析(debug和release版本的对比)VC编译开关选项分析(debug和release版本的对比)1. 参考资源经常需要用到VC的编译开关,在网上搜索和在MSDN中找大体资源如下。
几乎所有的中文文章都是以这两个为基础发展来的。
Compiler Reference:/en-us/library/aa236704(v=VS.60).aspxCompiler Options Listed by Category:/en-us/library/aa236703(v=VS.60).aspx2. VC中默认的选择项如下所示:/nologo/MDd/W3/Gm/GX/ZI /Od/D "WIN32" /D "_DEBUG" /D "_WINDOWS"/D"_AFXDLL"/D "_MBCS" /FR"Debug/" /Fp"Debug/FTTnSystem.pch"/Yu"stdafx.h"/Fo"Debug/"/Fd"Debug/" /FD/GZ /c/nologo/MT/W3/GX/Zi /O2/D"WIN32" /D "NDEBUG" /D "_WINDOWS"/D"_MBCS"/FR"Release/"/Fp"Release/FTTnSystem.pch"/Yu"stdafx.h" /Fo"Release/"/Fd"Release/" /FD /c色块标识:Debug和Release都有 Debug Release3. 具体讲解在VC中debug版本中包含了很多调试信息,而release版本则是发布版,而这些信息都在编译开关中体现出来了。
《深度探讨:C++ Release 和 Debug 编译的区别》在现今的软件开发行业中,C++ 语言作为一种经典而复杂的编程语言,一直以来都备受瞩目。
在 C++ 的编译过程中,Release 和 Debug 编译是两个极为重要的概念,它们对于软件的性能、稳定性和调试等方面都有着不可忽视的影响。
本文将从浅入深地探讨这两种编译方式的区别,以帮助读者更全面地理解 C++ 编译过程中的关键概念。
1. Release 和 Debug 编译概述让我们简要回顾一下 Release 和 Debug 编译的基本概念。
在 C++ 程序的编译过程中,Release 编译旨在生成优化后的可执行文件,以达到最佳性能和执行速度。
而 Debug 编译则注重在生成可执行文件的附带了调试信息,旨在为程序员提供更便捷、准确的调试功能。
2. Release 和 Debug 编译的差异接下来,我们来详细比较一下 Release 和 Debug 编译的主要差异。
在编译过程中,Release 编译会进行诸如函数内联、去除调试符号、优化代码等操作,以提高程序的执行效率和资源利用率。
而 Debug 编译则会保留调试信息、禁用优化等操作,以便于程序员在调试过程中准确地追踪变量、函数调用等信息。
3. Release 和 Debug 编译对程序性能的影响由于 Release 编译进行了大量的优化操作,因此生成的可执行文件往往具有更高的执行效率和更小的体积,适合部署到生产环境中。
而Debug 编译则由于保留了调试信息等,因此相对而言,生成的可执行文件会更大,执行效率较低,但却能够提供丰富的调试信息和功能。
4. 我对于 Release 和 Debug 编译的个人观点在我看来,Release 和 Debug 编译在实际开发中都具有其重要性。
Release 编译在保证程序性能的也能够节约资源,提高用户体验;而Debug 编译则在程序出现问题时,提供了必要的调试信息,有助于快速定位和修复 bug。
Visual Studio中的debug和release版本的区别Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和Release 的真正秘密,在于一组编译选项。
下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd /Fo,但区别并不重要,通常他们也不会引起Release 版错误,在此不讨论)Debug 版本参数含义/MDd /MLd或/MTd使用Debug runtime library (调试版本的运行时刻函数库)/Od 关闭优化开关/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数) /ZI 创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译/GZ 可以帮助捕获内存错误/Gm打开最小化重链接开关,减少链接时间Release 版本参数含义/MD /ML 或/MT 使用发布版本的运行时刻函数库/O1 或/O2 优化开关,使程序最小或最快/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改实际上,Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
事实上,我们甚至可以修改这些选项,从而得到优化过的调试版本或是带跟踪语句的发布版本。
哪些情况下Release 版会出错有了上面的介绍,我们再来逐个对照这些选项看看Release 版错误是怎样产生的1、Runtime Library:链接哪种运行时刻函数库通常只对程序的性能产生影响。
调试版本的Runtime Library 包含了调试信息,并采用了一些保护机制以帮助发现错误,因此性能不如发布版本。
软件中Debug和Release到底有什么区别?有很多软件集成开发环境(IDE),比如VS(VC)、IAR等,在创建工程时都会自动生成有Debug 和 Release两个版本。
有些小伙伴比较纳闷,Debug 和 Release两个版本到底有什么区别?下面就来讲讲Debug 和 Release版本区别,及其相关的内容。
嵌入式专栏1关于Debug 和 Release版本Debug,顾名思义,就是调试版本;Release,即发布版本,或者说最终释放版本。
在一些项目中,会出现Debug 和 Release两个版本,比如:IAR EWARM:VS:一些初学者可能会问,他们二者到底什么差异?其实,Debug 和 Release两个版本其实主要就是工程配置不同。
我们这里拿IAR EWARM来说,主要是:Project -> Options 下面的配置选项不同:嵌入式专栏2Debug 和 Release差异Debug 和 Release两个版本,最根本的区别在于Debug版本多了一些与调试相关的配置内容。
1.生成调试信息Debug版本通常会生成调试信息,而Release通常没有这些信息。
比如IAR EWRAM:这里的“生成调试信息”其实包含了很多关于调试的信息,如果勾选会多出“.pbd”、 “.browse”、 “.linf”等与调试有关的信息。
补充①“.pbd”、 “.browse”为浏览信息的文件,“.linf”为链接配置相关的文件。
具体可以参看:IAR系列教程12_IAR文件类型描述。
补充②这个配置信息保存在“.ewp”(工程配置)文件下,包含了Debug 和 Release两个版本的配置信息:<configuration> <name>Debug</name> ...配置 </configuration><configuration> <name>Release</name> ...配置</configuration>你可以对比一下两个配置的差异,就知道二者的一些区别:补充③Keil MDK类似,也有类似的关于调试的配置:Projcet -> Options for Target:2.预处理Debug版本通常会有“DEBUG”相关的预处理(宏定义)不知道大家经常用类似下面的调试宏定义没有:#ifdef DEBUG //Debug调试版本相关的配置strongerHuang#else //Release发布版本相关的配置strongerHuang#endif比如最常见的就是printf(打印信息),会通过“DEBUG”调试信息打开/关闭打印输出信息。
VS中Debug模式和Release模式的区别VS中Debug模式和Release模式的区别有些人可能会问VC中的Debug和Release模式到底有什么区别,能不能将两者混用。
这里是常见的看法:/en-US/vcgeneral/thread/775ce067-b225-4141-8b86-2d7e9b61db97/ syperk说:"Asaresult,I'veswitchedtocompilingmydebugbuildsusingthe/MD switch.Ifyoudothis,youalsohavetoundefinethe_DEBUGpreprocessormacro.O therwiseyougetlotsoferrorsabout_CrtDebugReportW()notfound.Thisfunctionis apparentlyinsertedintoyourcodeif_DEBUGisdefined,butisonlydefinedinthe debugCRT. Aslongasoptimizationisoffitseemstobeperfectlypossibletodebug programscompiledthisway,andtherearenoconcernsaboutCRTincompatibilit y.".但是他的说法并不完全正确。
混用有很多问题。
其中,最重要的一点是,混用通过不同的编译参数生成的模块是非常糟糕的做法,特别是涉及到条件编译的时候。
实际上,"Debug"和"Release"只是两套IDE预先设定好的编译参数和宏定义组合(例如我们经常遇到的_DEBUG和NDEBUG宏)。
编译器并不知道Debug和Release之分(不过MD和MDd编译参数会区分Debug版本和Release版本的运行时库)。
vs的命令参数全文共四篇示例,供读者参考第一篇示例:vs是微软公司推出的一款强大的集成开发环墶(IDE),被广泛用于开发各种类型的应用程序,例如Web应用程序、桌面应用程序、移动应用程序等。
在vs中,我们可以使用命令参数来执行一些特定的操作,比如编译代码、调试程序、部署项目等。
本文将介绍一些常用的vs命令参数,帮助开发人员更加高效地使用这个强大的开发工具。
1. /build:这个命令参数可以用来编译指定的解决方案或项目。
语法如下:devenv /build solution.sln。
这里的solution.sln表示要编译的解决方案的文件名。
如果不指定solution.sln,则会编译当前打开的解决方案。
3. /deploy:这个命令参数可以用来部署应用程序到指定的目标设备。
语法如下:devenv /deploy solution.sln/project:project.csproj /configuration:Debug /platform:x86。
这里的solution.sln表示要部署的解决方案的文件名,project.csproj表示要部署的项目文件名,configuration表示要部署的配置(Debug或Release),platform表示要部署的平台(x86、x64、AnyCPU等)。
7. /safemode:这个命令参数可以用来以安全模式启动vs,即在启动时禁用所有插件和扩展。
语法如下:devenv /safemode。
这样可以帮助排除插件和扩展可能导致的问题。
8. /?:这个命令参数可以用来查看vs的帮助文档。
语法如下:devenv /?。
这样可以查看所有可用的命令参数以及它们的用法和示例。
vs的命令参数可以帮助开发人员更加高效地使用这个强大的IDE,提高开发效率和质量。
开发人员可以根据自己的需要选择合适的命令参数来执行特定的操作,从而更好地完成开发任务。
希望本文介绍的vs命令参数对开发人员有所帮助,让他们更加熟练地使用这个优秀的开发工具。
[VC笔记]Debug和Release的困惑Lightning[0GiNr]PS:补充笔记,本文是在VC6的环境下编写的,VS2008无此BUG。
这些日子在写一些代码时遇到了一件令人非常囧的事情:同样的源码,DEBUG版本行为完全正常,RELEASE版本行为完全不正常。
按以往的经验,这一般都是#ifdef _DEBUG之类的宏导致了两个版本的行为不一致,但是我的程序中并没有显式或者隐式地使用过这个宏。
由于Release版本默认不支持调试,于是就把Release版本里挂上调试信息来试试。
在Project->Sittings的c/c++选项卡optimizations中选上Disable[DEBUG],Debug Info里填上Program Database,Link选项卡中搞定Generate debug info和Generate mapfile。
然后一按F5,行为完全和DEBUG版本一样正常!可是一换回默认的release,问题就会出现,狂郁闷……注释了几处代码,并且用printf输出了一些LOG后,我渐渐发现了问题所在:竟然是字符串操作的问题!为了便于说明,我先写一个例子:#include <windows.h>#include <stdio.h>int InsertString(char* pStr){strcpy(pStr, "world");return strlen(pStr);}int CreateString(char* pStr){strcpy(pStr, "Hello ");return strlen(pStr) + InsertString(pStr + strlen(pStr));}int main(void){char szHello[64] = "";int nLen = CreateString(szHello);printf("%s LEN = %d\n", szHello, nLen);system("pause");return 0;}你能猜出程序的输出是什么吗?DEBUG:RELEASE:数一下字符也知道,Release版本给出的LEN = 16是绝对错误的,问题出在CreateString函数的这一行:return strlen(pStr) + InsertString(pStr + strlen(pStr));在DEBUG版本或者加了调试信息的Release版中,VC编译器的编译结果是先计算加号左边的表达式,再计算右边的,这样,第一个strlen(pStr)计算的仅仅是"Hello "这个字符串的长度。
Debug与Release版本的区别Debug 和Release 并没有本质的区别,他们只是VC预定义提供的两组编译选项的集合,编译器只是按照预定的选项行动。
如果我们愿意,我们完全可以把Debug和Release 的行为完全颠倒过来。
当然也可以提供其他的模式,例如自己定义一组编译选项,然后命名为MY_ABC等。
习惯上,我们仍然更愿意使用VC已经定义好的名称。
Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。
至于是否需要DLL支持,主要看你采用的编译选项。
如果是基于ATL的,则Debug和Release 版本对DLL的要求差不多。
如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL 等库支持,而Release版本需要MFC42.DLL支持。
Release不对源代码进行调试,不考虑MFC的诊断宏,使用的是MFC Release库,编译时对应用程序的速度进行优化,而Debug则正好相反,它允许对源代码进行调试,可以定义和使用MFC的诊断宏,采用MFC Debug库,对速度没有优化。
既然Debug和Release仅仅是编译选项的不同,那么为什么要区分Debug和Release 版本呢?Debug和Release,在我看来主要是针对其面向的目标不同的而进行区分的。
Debug通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供强大的应用程序调试能力。
而Release通常称为发布版本,是为用户使用的,一般客户不允许在发布版本上进行调试。
所以不保存调试信息,同时,它往往进行了各种优化,以期达到代码最小和速度最优。
为用户的使用提供便利。
下面仅就默认的Debug和Release版本的选项进行比较,详细的编译选项可以看MSDN 的说明。
我们将默认的Debug和Release的选项设置进行比较,过滤掉相同设置,主要的不同如下:编译选项:/Od /D "_DEBUG" /Gm /RTC1 /MDd /Fo"Debug““" /ZI链接选项:/OUT:"D:“MyProject“logging“Debug“OptionTest.dll" /INCREMENTAL Release设置:编译选项:/O2 /GL /D "NDEBUG" /FD /MD /Fo"Release““" /Zi链接选项:/OUT:"D:“MyProject“logging“Release“OptionTest.dll" /INCREMENTAL:NODebug 版本:/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)/Od 关闭优化开关/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数)/ZI 创建Edit and continue数据库,在调试过程中如果修改了源代码不需重新编译/GZ 可以帮助捕获内存错误/Gm 打开最小化重链接开关,减少链接时间Release 版本:/MD /ML 或/MT 使用发布版本的运行时刻函数库/O1 或/O2 优化开关,使程序最小或最快/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改MDd与MD首先,Debug版本使用调试版本的运行时库(/MDd选项),Relase版本则使用的是发布版本的运行时库(vcrt.dll)。
iOS开发Debug和Release的理解<一>参考:/mad1989/article/details/40658033 1,Debug和Release版本区别?众所周知,我们进行iOS开发,在Xcode调试程序时,分为两种方式,Debug和Release,在Target的Setting中相信大家应该看到很多选项都分为Debug和Release,方便我们分别设置,满足调试和发布的不同需求。
Release是发行版本,比Debug版本有一些优化,文件比Debug 文件小Debug是调试版本,Debug和Release调用两个不同的底层库。
通俗点讲,我们开发者自己内部真机或模拟器调试时,使用Debug模式就好,等到想要发布时,也就是说需要大众客户使用时,需要build Release版本,具体区别如下:一、Debug是调试版本,包括的程序信息更多二、只有Debug版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句三、Release不包含任何调试信息,所以体积小、运行速度快那么,问题来了,我们调试程序时,该如何生成(Build)或运行Debug或是Release版本呢?Debug与Release区别及Xcode的调试及利用宏写的一些小算法Xcode左上角,点中项目名称-Edit Scheme,或是菜单栏-Product-Scheme-Edit Scheme 弹出界面如下:当你这里设置Debug时,你build/Run后就是debug版本,相应的,修改成Release模式,出来的就是release版本,这里可以很方便切换。
2,Archive(归档)的作用?刚开发时,始终不知道这个的作用,只知道要打包生成APP时,需要用这个,那么到底Archive和Release有什么关系呢?archive是你要上传包的时候,打包。
也就是说Archive只跟APP 要上传到appStore的时候有关,一般情况下,只有在那个时候才会用Archive,可以这么理解。
Debug版本和Relase版本⽐较前⾔⼀直知道有存在Debug版和Relase版,⼀直不是特别清楚两者到底存在什么样的本质的差别,所以在这⾥做⼀个⽐较,这⾥以HellWorld代码为例。
代码:1. #include <Windows.h>2. #include <tchar.h>3.4. int _tmain(int argc, TCHAR *argv[]){5. MessageBox(NULL, L"Have a test", L"OK", MB_OK);6.7. return 0;8. }⼀、⼤⼩两者的⼤⼩存在实质上的差别,两者之间的⼤⼩存在很⼤差异。
可以看到Debug版本的⼤⼩快是release版本的5倍了,那么到底是什么导致release⽐Dbueg版本⼩这么多呢?debug版本,通常也称为调试版本,编译结果包含调试信息,⽽且不做任何优化,为开发⼈员提供强⼤的应⽤成虚调试功能release版本,通常也称为发布版本,不保存调试信息,并且进⾏了各种优化,以达到⼤妈最⼩和速度最优。
很多朋友⼜想问了,那么调试信息⼜是写什么信息呢?release做了优化,⼜优化了些什么呢?调试信息⽐如,在调试你的代码的时候,你会下⼀个断点,那么调试器如何知道你下了⼀个断点呢?也就是我们的调试信息会告知调试器的啦。
平时调试的时候我们还会去看⼀下变量的值是否是我们预期的那么多,这⾥也是调试器通过调试信息找到该变量的值并展⽰出来。
想要知道更多关于调试信息的只是,可以看看编译原理相关的东西,⽴⾯讲的更加的详细release优化1. ⾸当其冲的应该就是调试信息啦,release不包含调试信息2. 对变量的优化,Debug版本如果不对变量进⾏初始化,变量⾃动初始化为0XCC,删除动态分配的内存时将其赋值为0XCD。
Release版本不对变量进⾏初始化,删除动态分配内存的时候也不对内存中的数据进⾏处理3. 内存分配长度的处理,Debug版本分配字节以32bytes为单位,release则是以8bytes为单位。
Debug和Release区别VC下Debug和Release区别最近写代码过程中,发现Debug 下运行正常,Release 下就会出现问题,百思不得其解,而Release 下又无法进行调试,于是只能采用printf方式逐步定位到问题所在处,才发现原来是给定的一个数组未初始化,导致后面处理异常。
网上查找了些资料,在这罗列汇总下,做为备忘~一、Debug 和Release 的区别Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug 和Release 的真正区别,在于一组编译选项。
Debug 版本参数含义/MDd /MLd 或/MTd 使用Debug runtime library(调试版本的运行时刻函数库)/Od 关闭优化开关/D "_DEBUG" 相当于#define _DEBUG,打开编译调试代码开关(主要针对assert函数) /ZI创建Edit and continue(编辑继续)数据库,这样在调试过程中如果修改了源代码不需重新编译GZ 可以帮助捕获内存错误Release 版本参数含义/MD /ML 或/MT 使用发布版本的运行时刻函数库/O1 或/O2 优化开关,使程序最小或最快/D "NDEBUG" 关闭条件编译调试代码开关(即不编译assert函数)/GF 合并重复的字符串,并将字符串常量放到只读内存,防止被修改Debug 和Release 并没有本质的界限,他们只是一组编译选项的集合,编译器只是按照预定的选项行动。
1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过)。
这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。
所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。
代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧呵呵,就是我犯的问题~~2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。
这也存在debug跟release的问题吗?答案是肯定的。
在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); Debug情况下一般不会有任何问题,而当你在Release下且多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。
导致这个错误直接原因是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (注2)3. release模式下不出错,但debug模式下报错。
这种情况下大多也是因为代码书写不正确引起的,查看MFC的源码,可以发现好多ASSERT 的语句(断言),这个宏只是在debug模式下才有效,那么就清楚了,release版不报错是忽略了错误而不是没有错误,这可能存在很大的隐患,因为是Debug模式下,比较方便调试,好好的检查自己的代码,再此就不多说了。
4. ASSERT, VERIFY, TRACE..........调试宏这种情况很容易解释。
举个例子:请在VC下输入ASSERT然后选中按F12跳到宏定义的地方,这里你就能够发现Debug中ASSERT要执行AfxAssertFailedLine,而Release下的宏定义却为"#define ASSERT(f) ((void)0)"。
所以注意在这些调试宏的语句不要用程序相关变量如i++写操作的语句。
VERIFY是个例外,"#define VERIFY(f) ((void)(f))",即执行,这里的作用就不多追究了,有兴趣可自己研究:)。
总结:Debug与Release不同的问题在刚开始编写代码时会经常发生,99%是因为你的代码书写错误而导致的,所以不要动不动就说系统问题或编译器问题,努力找找自己的原因才是根本。
我从前就常常遇到这情况,经历过一次次的教训后我就开始注意了,现在我所写过的代码我已经好久没遇到这种问题了。
下面是几个避免的方面,即使没有这种问题也应注意一下:1. 注意变量的初始化,尤其是指针变量,数组变量的初始化(很大的情况下另作考虑了)。
2. 自定义消息及其他声明的标准写法3. 使用调试宏时使用后最好注释掉4. 尽量使用try - catch(...)5. 尽量使用模块,不但表达清楚而且方便调试。
注1:debug版初始化成0xcc是因为0xcc在x86下是一条int 3单步中断指令,这样程序如果跑飞了遇到0xcc就会停下来,这和单片机编程时一般将没用的代码空间填入jmp 0000语句是一样地转贴于:计算机二级考试_考试大【责编:drfcy 纠错】[VC]DEBUG和RELEASE2007年08月26日星期日下午04:33 I. 内存分配问题1. 变量未初始化。
下面的程序在debug中运行的很好。
thing * search(thing * something)BOOL found;for(int i = 0; i < whatever.GetSize(); i++){if(whatever[i]->field == something->field){ /* found it */found = TRUE;break;} /* found it */}if(found)return whatever[i];elsereturn NULL;而在release中却不行,因为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版中,就有ACCESS VIOLATE。
II. ASSERT和VERIFY1. ASSERT在Release版本中是不会被编译的。
ASSERT宏是这样定义的#ifdef _DEBUG#define ASSERT(x) if( (x) == 0) report_assert_failure()#else#define ASSERT(x)#endif实际上复杂一些,但无关紧要。
假如你在这些语句中加了程序中必须要有的代码比如ASSERT(pNewObj = new CMyClass);pNewObj->MyFunction();这种时候Release版本中的pNewObj不会分配到空间所以执行到下一个语句的时候程序会报该程序执行了非法操作的错误。
这时可以用VERIFY :#ifdef _DEBUG#define VERIFY(x) if( (x) == 0) report_assert_failure()#else#define VERIFY(x) (x)#endif这样的话,代码在release版中就可以执行了。
III. 参数问题:自定义消息的处理函数,必须定义如下:afx_msg LRESULT OnMyMessage(WPARAM, LPARAM);返回值必须是HRESULT型,否则Debug会过,而Release出错IV. 内存分配保证数据创建和清除的统一性:如果一个DLL提供一个能够创建数据的函数,那么这个DLL 同时应该提供一个函数销毁这些数据。
数据的创建和清除应该在同一个层次上。
V. DLL的灾难人们将不同版本DLL混合造成的不一致性形象的称为“动态连接库的地狱“(DLL Hell) ,甚至微软自己也这么说/library/techart/dlldanger1.htm)。
如果你的程序使用你自己的DLL时请注意:1. 不能将debug和release版的DLL混合在一起使用。
debug都是debug版,release 版都是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)。
编译器的优化可能导致许多意想不到的错误,请参/~newcomer/debug_release.htm1. 此外对RELEASE版本的软件也可以进行调试,请做如下改动:在"Project Settings" 中"C++/C " 项目下设置"category" 为"General" 并且将"Debug Info"设置为"Program Database"。