可以这么说:release版本取掉了debug信息,进行了优化。
举个例子:那断言----Assertion来说,很多库函数本身的实现代码里,包含了很多的断言。通过ASSERT宏来声明这些断言,这个宏只有在程序的debug版里才有效。而在release版里它完全被忽略,为的也就是减少系统的消耗,至于debug版本运行结果正确,可release版却出错,可能的问题也就在这些断言里,特别是自己写的断言。
比如ASSERT(***)这***里不光是判断,如果还有其他创建之类的操作,到了release版,被忽略后,也就容易带来问题。举个例子:
int a;
debug时a值恒定,总为cdcdcdcdrelease时a值不定,为当时内存值这时你在使用a时就会引起结果的不一致,甚至导致溢出!所以对变量初始化尤其是对指针,数组变量初始化是一个良好的习惯!debug与release的不同大多是因为程序代码写的不规范,不严谨而造成的。
关于Debug和Release之本质区别的讨论~~(主要针对VC6.0和VS2003.net编译工具而言)
一、Debug 和 Release 编译方式的本质区别
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
Debug
和Release的真正秘密,在于一组编译选项。下面列出了分别针对二者的选项(当然除此之外还有其他一些,如/Fd/Fo,但区别并不重要,通常他们也不会引起
Release版错误,在此不讨论)
Debug 版本:
/MDd /MLd
或/MTd 使用
Debug runtimelibrary(调试版本的运行时刻函数库)
/Od 关闭优化开关
/D"_DEBUG" 相当于
#define_DEBUG,打开编译调试代码开关(主要针对
assert函数)
/ZI 创建
Edit andcontinue(编辑继续)数据库,这样在调试过
程中如果修改了源代码不需重新编译
/GZ 可以帮助捕获内存错误
/Gm