内存填充值的理解

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

posted on 2007-10-16 16:53 Randy 阅读(783) 评论(8)  编辑 收藏 引用

评论

# re: 内存填充值的理解 2008-08-18 10:04 Anon

那请问为什么我的测试结果代码是:
char *pc = (char *)malloc(4);
int i;
for (i = 0;i < 4;i++)
printf("%x",pc[i]);
free(pc);
为什么结果是0000 ??  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 10:10 Randy

@Anon
请描述一下你的测试环境,或者是不是在debug下测试的。  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 10:46 Anon

WinXP, 编译器GCC, Debug版本,谢谢,  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 10:49 Randy

@Anon
此情况特指在微软的编译环境下  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 11:07 Anon

哦,但是Windows下的GCC,为什么没有调用MSVC底层调用的系统函数,  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 11:13 Anon

还有个问题请教下,在实模式下给出1000:0002,可以寻址到1000<<16+0002的内存,那么如果在保护模式下,虚拟地址给出10000002, 分段单元是否也会做类似的处理?
  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 11:23 Randy

@Anon
内存填充值主要和CRT库有关,所以是否符合上面所说的只是看编译环境是否用使用微软的CRT库。我并没有用过GCC编译。不过GCC使用的肯定不是微软的CRT库吧。第二个问题的话,我也不是很清楚,呵呵帮不到你  回复  更多评论   

# re: 内存填充值的理解 2008-08-18 11:27 Anon

哦, 你这么一说明白起来了,GCC的 CRT库和MS不同,像malloc这些函数都有自己的实现,
另外感谢你的回答呵呵...还会关注你这里的.  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

导航

统计

常用链接

留言簿(3)

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜