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。
记忆中有过释放之后看到 0xDD 的情况,而且 CRT 的代码里也的确有并不立刻调用 HeapFree 来真正释放内存的分支,但测试代码并未达到。
另外,0xCC 也是有的,好像是编译器做的事情之一,用于填充栈上的自动变量。
上述 CRT 的行为均为 Debug 版本的表现。
上述的系统行为(即 HeapXXX 函数族的行为)均为在 Windows Xp SP2 上的表现。