内存填充物

今天偶然和 Jeffrey 还有老倪谈论起 VC 中新分配的内存以及刚释放的内存中的内容的问题。在我的记忆里,应该是刚分配的内存被填充为 0xCC,释放后被填充为 0xDD,但 Jeffrey 说释放后是 0xFEEE,而经他这么一说,好像我对这个数字也有一定的印象,所以从单位加班回来后写程序验证了一下。结果附后。

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 Server 2003 SP1 上的表现。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注