我正在尝试使用最合适的方式创建我自己的malloc版本。为此,我使用链接列表来跟踪分配。但是,当我去分配空间时,链接列表似乎没有连接。我一遍又一遍地看过代码,但看不出问题。任何帮助都会受到如此多的赞赏。
答案 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);
由于best
是struct 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;记忆可能不是真的。