我在win7中做了一个简单的实验,使用以下代码测试它在内存分配中对堆的组织:
char *pointer[50];
for(i=0;i<=49;i++) pointer[i]=new char[64];
for(i=0;i<=49;i++) printf("0x%X\n",pointer[i]);
输出结果为:
0x572F00
0x572F48
0x572F90
.
显然,两个相邻指针之间的空间是72字节而不是64字节。必须在每个堆区块的前几个字节中保存一些信息。我打印出了8个额外字节中的值,发现它们是:
71 39 19 36 B3 9F 00 08
有人能告诉我如何从这些值中判断出堆块的大小吗?谢谢!
发布于 2014-03-30 14:02:55
仅仅是你想要这样做的想法就相当可怕。这是未记录的信息,可能会在没有通知的情况下更改,在调试和非调试版本之间可能会有所不同,等等。我强烈建议您找到另一种方法,例如使用您自己的分配器存储长度。
在回答你的问题时,我知道存储的信息是一个向前和向后链接和一些标志。这些链接可能使用XOR方案存储在单个指针中。可能也有一个前哨。
如果你真的想知道这个问题的答案,很容易就能找到。只需在Visual Studio中编译和运行您的程序,然后进入new的C运行时库代码。所有的声明和代码都在那里供您阅读。完整的评论,非常直白的东西。
请注意:这是与Windows7API无关的。这是与C++编译器(我假设是Visual Studio)关联的运行时库。
Windows7内部有几个内存分配器,但那是一个完全不同的故事。
https://stackoverflow.com/questions/22740683
复制相似问题