在 Debug 模式下会自动加上 /GZ 编译选项,它可以帮助捕获内存错误。
/GZ 选项会做以下这些事
1、 初始化内存和变量。
/GZ 选项会做以下这些事
1、 初始化内存和变量。
a、0xCC 初始化所有自动变量(如定义一个数组,CC 是int 3h的机器码,这是一个中断指令);
char szBuf[10];对应的内存如下
b、0xCD ( Cleared Data ) 初始化堆中分配的内存(即动态分配的内存,例如 new );
c、0xDD ( Dead Data ) 填充已被释放的堆内存(例如 delete );
d、0xFD ( deFencde Data ) 初始化受保护的内存(debug 版在动态分配内存的前后加入保护内存以防止越界访问),
char *pBuf = new char[5];对应的内存如下,05是分配的长度,这就是为什么在delete的时候只传递指针,而不用指定大
小的原因。00381000地址出是分配后返回的地址,用5个CD填充,在前后分别用4个FD填充作为,保护内存的标志。在释放内存
的时候会对这些标志做判断,这也就是为什么有的时候在内存越界后delete会崩掉的原因。
其中括号中的词是微软建议的助记词。这样做的好处是这些值都很大,作为指针是不可能的(而且 32 位系统中指针很少是奇数值,在有些系统中奇数的指针会产生运行时错误),作为数值也很少遇到,而且这些值也很容易辨认,因此这很有利于在 Debug 版中发现 Release 版才会遇到的错误。要特别注意的是,很多人认为编译器会用 0 来初始化变量,这是错误的(而且这样很不利于查找错误)。
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配)
(3) 函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略FPO)
“烫”字的MBCS编码为“CCCC”,而用 /GZ 选项对自动变量会用“0xCC”初始化,连续的“0xCC”将被误读成“烫”字符。
(2) 通过函数指针调用函数时,会通过检查栈指针验证函数调用的匹配性。(防止原形不匹配)
(3) 函数返回前检查栈指针,确认未被修改。(防止越界访问和原形不匹配,与第二项合在一起可大致模拟帧指针省略FPO)
“烫”字的MBCS编码为“CCCC”,而用 /GZ 选项对自动变量会用“0xCC”初始化,连续的“0xCC”将被误读成“烫”字符。
关于new和delete可以参考
http://topic.csdn.net/t/20061104/21/5133631.html