如果我重新分配到更小的尺寸会怎样?
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()
会得出这样的结论,即在末尾删除几个字节是不值得的,而且实际上并没有做任何事情。
我目前正在研究动态内存分配,我有一个关于 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()
会得出这样的结论,即在末尾删除几个字节是不值得的,而且实际上并没有做任何事情。