实现malloc时链接列表无法正常工作

时间:2015-03-22 01:53:43

标签: c

我正在尝试使用最合适的方式创建我自己的malloc版本。为此,我使用链接列表来跟踪分配。但是,当我去分配空间时,链接列表似乎没有连接。我一遍又一遍地看过代码,但看不出问题。任何帮助都会受到如此多的赞赏。

1 个答案:

答案 0 :(得分:2)

一个问题是分配节点结构:

root = (struct node *)sbrk(sizeof(root));
...
added = (struct node *)sbrk(sizeof(root));

应该是:

root = (struct node *)sbrk(sizeof(*root));
...
added = (struct node *)sbrk(sizeof(*root));

充其量,您的节点和分配将会分享"记忆不正确。

另外,我认为你需要小心确保你的记忆正确对齐。我不确定您的代码(或sbrk)是否会这样做。

以下是拆分代码的问题:

return best+sizeof(best);
...
newnode = best+best->mallocsize+sizeof(root);

由于beststruct node*,因此这些新增内容会在内存中超出我的预期。我认为您打算在这些表达式中将best投射到(char*)

另外,我认为newnode的计算错误,即使你转向(char*)也是如此。我想你想要更像的东西:

newnode = best + 1 + size / sizeof(*root) + !!(size % sizeof(*root));

您也忘了计算并设置newnode->mallocsize

以下数学可能会在无符号(即int提升为size_t)中完成:

if (best->mallocsize-size-sizeof(short) < sizeof(root)) {

在这种情况下,您可以在左侧下溢0,这将导致您不正确地拆分节点。你可以通过将减法抛到不等式的另一边来解决这个问题,因为你已经确保了size < best->mallocsize

if (best->mallocsize - size < sizeof(root) + sizeof(short)) {

其他几点:

  • 在您最适合的搜索中,您几乎总是因某种原因跳过根。
  • 在最适合的搜索中,您不会考虑mallocsize等于size的未使用节点。
  • 在最适合的搜索中,一旦找到最佳大小的未使用节点(即 - size == current->mallocsize),就结束搜索(即 - 打破循环)。
  • 在您的分配中,您拨打sbrk两次:一次用于您的节点,一次用于应用程序的内存。如果你这样做是为了确保记忆的正确对齐,那么这很好(假设sbrk为你做了这个),但是你假设node + 1给你的是应用程序的地址& #39;记忆可能不是真的。