制作自定义的Malloc,这里有什么问题?

时间:2013-04-09 02:35:44

标签: c malloc

我一直在研究一个使用双链表的一个小的自定义最差装置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;
}

1 个答案:

答案 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 + 1node需要进行相应的反向调整才能检索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可以在以后重用它。

我不知道您的代码是否还有其他问题;我想说很有可能会出现这些类型的基本问题。