我一直在研究一个使用双链表的一个小的自定义最差装置Malloc,虽然这个很小但我觉得这样可行。这段代码有什么明显的错误吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mymal.h"
typedef struct Node
{
int size;
int status;
struct Node *next;
struct Node *previous;
} Node;
Node *endNode;
Node *rootNode;
void *worstfit_mall(int size)
{
Node *theNode = sbrk (size + sizeof(theNode));
void *ptr;
if (rootNode == NULL)
{
theNode->status = 1;
theNode->size = size;
theNode->previous = theNode;
theNode->next = theNode;
rootNode = theNode;
endNode = theNode;
return theNode;
}
Node *worstNode;
worstNode = worstFit(size);
if (worstNode != NULL)
{
theNode->status = 1;
theNode->size = size;
Node *newNode = sbrk((worstNode->size - theNode->size) + sizeof(theNode));
newNode->status = 0;
newNode->size = worstNode->size - theNode->size;
theNode->next = newNode;
theNode->previous = worstNode->previous;
newNode->next = worstNode->next;
return newNode;
}
endNode->next = theNode;
endNode = theNode;
endNode->status = 1;
endNode->size = size;
ptr = sbrk(size + sizeof(theNode));
return ptr;
}
void my_free(void *ptr)
{
Node *pointer;
pointer = (Node*)ptr;
pointer->status = 0;
if ((pointer->next->status == 0) && (pointer->previous->status == 0))
sbrk(-1 * (pointer->next->size + pointer->size));
else if ((pointer->next->status == 1) && (pointer->previous->status == 0))
sbrk(-1 * (pointer->previous->size + pointer->size));
else if ((pointer->next->status == 0) && ( pointer->next->status == 0))
sbrk(-1 * (pointer->previous->size + pointer->next->size + pointer->size));
else
sbrk(-1 * pointer->size);
}
void *worstFit(int size)
{
Node *theNode = rootNode;
Node *worstNode;
while (theNode != NULL)
{
if ((worstNode == NULL || theNode->size > worstNode->size) && (theNode->size >= size) && (theNode->status == 0))
worstNode = theNode;
theNode = theNode->next;
}
return worstNode;
}
答案 0 :(得分:1)
以下是立即引起我注意的事情:
worstFit
未将worstNode
初始化为NULL
,并尝试在它仍然是垃圾的情况下阅读它。
您创建了Node
s的链接列表,但尾部Node
的{{1}}始终指向自己。同时,next
在迭代列表时需要worstFit
哨兵值。
NULL
时, worstfit_mall
未初始化endNode
。
rootNode
返回指向已分配的worstfit_mall
的指针,但如果它意味着可以替代Node
,那么它应该返回指向内存的指针允许调用者写入。您不希望来电者在您的malloc
数据上涂鸦。
我希望Node
返回worstfit_mall
(或更简单地说,((char*) node) + sizeof *node)
),而不是直接返回node + 1
。 node
需要进行相应的反向调整才能检索my_free
指针。
Node
此外,我不清楚为什么void my_free(void *ptr)
{
Node *nodePtr = ptr;
nodePtr--;
...
}
在worstfit_mall
路径向下时sbrk
通过worstNode != NULL
分配内存。这个路径的重点是找到现有的内存块以供重用吗?此外,此路径会调用sbrk
两次。
最后,在我看来,my_free
无条件地减少了已分配内存的数量,但只有在您释放了使用sbrk
分配的最后一项内容时,这才有效。如果您在第一次结果中调用worstfit_mall
两次然后调用my_free
,该怎么办?没有my_free
将内存块标记为不再使用的路径,以便worstfit_mall
可以在以后重用它。
我不知道您的代码是否还有其他问题;我想说很有可能会出现这些类型的基本问题。