如果我重新分配到更小的尺寸会怎样?

What happens if I realloc to smaller size?

我目前正在研究动态内存分配,我有一个关于 realloc 函数的问题。 我了解到新分配的块的内容应该与旧块的内容相同,最多为新旧大小中的最小值,其他所有内容均未初始化。

如果堆块正在使用边界标记,而我正在重新分配到更小的大小怎么办?

我要问的是,例如,这里有一个24-bytes-sized的内存块,它的前4个字节是header,中间16个字节是payload,最后4个字节是页脚。我已经将这个块缩小到 16 个字节,其前 4 个字节将是新块的 header,最后 4 个字节将是新块的页脚。

首先,header有变化吗? Header 应该包括有关块大小和分配位的信息,但新块的内容应该相同。这是否意味着 header 中的所有内容包括块大小信息都保持不变,这对我来说似乎完全没有用?

其次,新版块的页脚应该怎么放?页脚应位于新块的第 13 ~ 16 个字节。但是新旧块的内容最多16个字节应该是一样的,如果我把页脚放在第13~16个字节就违反了!

抱歉问了这么一个冗长的问题,但我现在非常非常困惑。 希望我能找到答案。


有关问题的其他信息)

我目前正在 CS:APP 的 malloc 实验室工作,它希望我通过编写我自己版本的 malloc、free 和 realloc 例程来设计分配器。它说这些函数应该匹配相应的 libc malloc、free 和 realloc 例程的语义。

现在我实际上正在实现自己的 realloc 函数,我对这些情况感到困惑。所以我希望我能得到C标准库实现级别的答案。

您保留缓冲区的前 size 个字节。

我看到一个 realloc() 会砍掉结尾并用缓冲区的结尾构造一个新的空闲堆块。

我看到另一个 realloc() 可以将缓冲区移到末尾并去掉前面的部分。

我看到另一个 realloc() 总是会分配一个新缓冲区并移动内存。

奇怪的事情可能会发生,我敢肯定。

有时 realloc() 会得出这样的结论,即在末尾删除几个字节是不值得的,而且实际上并没有做任何事情。