release和debug详细(121)

这几天翻了下笔记本,有好多知识没同步上来,写起!

它们无本质区别,只是在编译的时候多添加了一些编译选项。

DEBUG Are
/mdd,mtd c语言运行库(不讲了)
/od 关闭优化开关
/D 给_DEBUG宏
/ZI 创建edit continue数据库(就是修改源码不重新编译)
/GI 捕获内存错误
/GM 打开最小化重链接开关,减少链接时间
RELEASE Are
/mt,/md
/o1,/o2 优化开关,使程序最小或最快
/d “NDEBUG宏” 关闭条件编译调试代码开关(即不编译assert函数)
/gf 合并重复字符串并放入只读内存

再来看下一个debug的现象
/rtcx(插入动态检测代码)这个编译选项有点意思

0XCC初始化所有的自动变量 。

所以会发现无论在栈控件只声明不定义会发现:int都是(-858993460)
char*一般都是0xccccccc,开辟个char数组会是:烫烫烫烫烫烫类型的

####oxcd堆分配内存,0xdd填充delete内存,0xfd填充被保护内存

所以看到的堆new的数据:int永远是-842150451, char*:0xcdcdcdcd(屯屯屯屯屯屯屯)
还有一种情况,就是debug模式一般会保护new的内存,所以会向前后加0xfdfdfdfd保护内存防止越界访问(恰恰恰恰恰恰“麻蛋,金字旁的不会打,算了”)

最后说下俩个模式注意项

网上说对windows的消息函数格式要严格要求(呵呵, 我没遇见过,反正一直都严格要求了)

assert代码会忽略(遇见过)verify可以使用,但自己注意吧,我觉得这种宏。。

未使用的变量会被去掉,网上有段这相关的代码,从代码的函数内存分配和入栈来想,确实会导致内存越界,结果跑的时候就是没变化感觉是坑,但还是注意吧。。<>

// //