gpt4 book ai didi

c - 动态内存分配器

转载 作者:行者123 更新时间:2023-11-30 20:49:42 25 4
gpt4 key购买 nike

给出以下问题,并提供以下答案:

enter image description here

enter image description here

如何计算绿色轮廓区域中的值?我相信我对 C 中的 free() 函数如何工作以及它的作用有相当扎实的了解:清除堆堆栈上动态分配的内存块(要么完全删除它,要么使它免费使用,以供将来分配)。

我不明白的是,对 free(0x400b010) 的调用如何仅更改上面的一些其他堆 block ? (我用绿色勾勒出的)。我发现地址 0x400b010 (二进制值:01000000 00001011 01100000 00011100 不会改变,根据已释放的分配,具有 0在其位 0 中。

谁能给我解释一下吗?例如,当上面的 block 调用 free 时,地址 0x400b00c:0x000000013 处的 block 将其值(:) 后的第二个参数更改为 0x00000022。此示例只是奇怪的情况之一,其中先前分配的 block (位 0 中的 1)变为空闲,即使没有调用该 block 地址。

类似,一些 block 会更改其值,而另一些则不会。

我尝试以多种不同的方式来处理这个例子,但我无法解释为什么这个解决方案看起来是这样的,所以我希望这里有人可以向我解释到底发生了什么。

最佳答案

我试图寻找一个人物,但找不到任何令人满意的东西。我会尝试用文字来解释。

如果比较左右表格,您会发现更改的框是 0x400b00c 和 0x400b028,分别从 13 和 12 变为 22。

注意每个内存块都有一个页眉和页脚。由于free是在0x400b010处执行的,因此表明0x400b00c是 header 。因此,下面的所有条目(400affc ~ 400b008)将保持不变,因为它将不受自由操作的影响。

从0x400b00c向上查找,之前有2个 block :

  • 区 block 1:0x400b00c ~ 0x400b018
  • block 2:0x400b01c ~ 0x400b028

请注意, block 2 未使用,因为位 0 表示当前 block 的使用,但值 0x0000012 是偶数。因此,如果 block 1 被释放,则 block 1 和 block 2 将合并在一起形成一个新的未使用的 block 。

这里发生的情况是,合并过程将尽可能高效地进行。因此, block 1 的前一个页脚和 block 2 的前一个页眉将保持不变,因为它们不需要这样做。释放内存空间不需要初始化。

因此,唯一需要进行的更改是新 block 的新页眉和页脚,即位置 0x400b00c 和 0x400b028。

请注意,新页眉和页脚之间有 8 个 block (含),总共 8 * 4 = 32 字节。二进制中的 32 是 100000,但由于前一个 block (未更改的 block )正在使用,因此位 1 设置为1。结果是 100010,十六进制 22。

抱歉,如果此解释令人困惑,请询问您是否无法理解此答案的任何部分。

关于c - 动态内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59624231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com