给出以下问题,并在下面提供答案:
如何计算绿色轮廓区域中的值?我相信我对C中的free()
函数如何工作以及它的作用有很好的理解:清除动态分配在堆堆栈上的内存块(将其完全删除,或使其免费使用,以供将来分配) )。
我不明白,对free(0x400b010)
的调用如何仅更改上面的其他一些堆块? (我用绿色勾勒出的轮廓)。我得到的地址0x400b010
(具有二进制值:01000000 00001011 01100000 00011100
不会更改,根据已释放的分配,其中0
中包含bit 0
。
有人可以向我解释吗?例如,当在上面的块上调用free时,地址0x400b00c:0x000000013
上的块将其值(:之后的第二个参数)更改为0x00000022
。此示例只是其中几种奇怪的情况之一,即使先前未分配空闲地址的调用,先前分配的块(在1
中的bit 0
)也变为空闲。
类似的一些块改变了它们的值,而另一些没有改变。
我试图以多种不同方式参与该示例,但我无法弄清楚为什么该解决方案采用这种方式,因此我希望这里的人可以向我解释到底发生了什么。
malloc
返回的指针(然后传递给free
)指向该块的用户内容的第一个字节,而不是标题(或页脚)。因此,要在free
中找到块的标题,您需要从指针参数中减去4(标题的大小)。
因此,当调用free(0x400b010)
时,第一件事是减去4并在0x400b00c处获得块的标题,即0x13。这告诉您该块为16字节(0x10),并且正在使用(已设置位0),而上一个块正在使用(已设置位1)。