Debug版本下CRT对分配内存的填充

来源:互联网 发布:程序员必读书单top10 编辑:程序博客网 时间:2024/04/29 05:55
1、使用 new 或者 malloc 分配后的内存,其内容被填充为 0xCD,CRT 中称处于这种状态的内存区为 Clean Land,即干净区,由此推测 0xCD 的含义可能为 Clean Data。在此数据的前后(不包含于此区域内),各有一个守卫用的 DWORD,其内容为 0xFDFDFDFD。
2、使用 delete 或者 free 释放后的内存,其内容被清空为 0xDD,CRT 中称处于这种状态的内存区为 Dead Land,即死区,由此推测 0xDD 的含义可能为 Dead Data。守卫用 DWORD 也同时被清除。
3、使用 HeapAlloc 分配的内存,其内容被填充为 0xBAADF00D,我推测为 Bad Food 的变体,经过 HeadFree 释放的内存,其大部分内容会被填充为 0xFEEE,但起始的两个 DWORD 不是,在我的机器上这两个 DWORD 的值均为 0x00140238,含义不详。
 
在简单的测试中,delete/free 最终总会调用到 HeapFree,因而看到的释放后的内存中是 0xFEEE,而 new/malloc 虽然调用了 HeapAlloc,但之后又填充了 0xCD,故而看到的是 0xCD。

0xCD 空内存 用new或malloc分配但从未被写入过的内存.可以用来发现分配单位使用的内存.
0xDD 死内存 已经用delete或者free释放掉的内存,用来发现挂起的野指针.系统一般会报错0xC0000005访问0xDDDDDDDD出错.
0xFD 护栏内存 这个标志主要是会出现在已分配的内存周围,像栅栏似的,如果你的数组越界的话,一般都会出现0xC0000005访问0xFDFDFDFD无法访问.
0xAB ? 由LocalAlloc()在本地堆分配的内存初值,这个一般见得少.
0xBAADF00D 很难吃
(微软员工在某次食堂吃饭后开始使用:D)
 一般的HeapAlloc和LocalAlloc分配内存的初值都是这个,最常见为使用未初始化的指针导致0xC0000005访问0xBAADFOOD出错.
0xCC   当代码使用/GZ进行编译时, 未初始化的变量的初值都为CC.最常见为使用未初始化的指针导致0xC0000005访问0xCCCCCCCC出错.

1.使用VC(VC2005/VC2008)编译程序时,如果你启动了%26ldquo;/RTC1%26rdquo;(VC6使用/GZ)去编译调试模式的程序,那么程序运行时VC的运行库就会使用特定的值填充申请和释放的内存,在调试内存错误时非常有用。
0xCC:填充未初始化的栈变量。
0xCD:填充从堆中申请的内存。
0xDD:已经释放的内存。
0xFD:填充应用程序申请内存的前后的内存(前面4个字节,后面4个字节)。 

2.Windows的堆管理函数也会使用特定的值填充申请和释放的内存。
0xBAADF00D:HeapAlloc()申请内存后,用它填充新申请的内存。
0xABABABAB:HeapAlloc()申请内存后,用它填充新申请的内存之后的内存。