gpt4 book ai didi

c - 制作自定义 Malloc,这里出了什么问题?

转载 作者:行者123 更新时间:2023-11-30 15:50:07 27 4
gpt4 key购买 nike

我一直在使用双链表开发一个自定义的最坏拟合 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;
}

最佳答案

以下是让我立即印象深刻的事情:

  • worstFit 不会将 worstNode 初始化为 NULL 并尝试在它仍然是垃圾时读取它。

    <
  • 您创建了 Node 的链表,但尾部 Nodenext 始终指向其自身。同时,worstFit 在迭代列表时需要一个 NULL 标记值。

  • worstfit_mall 在最初创建 rootNode 时不会初始化 endNode

  • worstfit_mall 返回指向分配的 Node 的指针,但如果它可以替代 malloc,则应该返回指向允许调用者写入的内存的指针。您不希望调用者在您的 Node 数据上乱写乱画。

    我希望 worstfit_mall 返回 ((char*) node) + sizeof *node) (或更简单地说,node + 1) 而不是直接返回nodemy_free 需要进行相应的反向调整来检索 Node 指针。

    void my_free(void *ptr)
    {
    节点 *nodePtr = ptr;
    节点Ptr--;
    ...
    }

  • 此外,我不清楚为什么 worstfit_mall 在沿着 worstNode != NULL 路径前进时通过 sbrk 分配内存。这条路径的重点不是要找到一个现有内存块来重用吗?此外,此路径调用 sbrk 两次

  • 最后,在我看来,my_free 无条件地减少了分配的内存量,但只有当您释放使用 sbrk< 分配的最后一个内容时,这才有效。/。如果您调用 worstfit_mall 两次,然后对第一个结果调用 my_free 会怎么样?不存在 my_free 将内存块标记为不再使用的路径,以便 worstfit_mall 以后可以重用它。

不知道你的代码是否还有其他问题;我想说,很可能存在这些类型的基本问题。

关于c - 制作自定义 Malloc,这里出了什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15892342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com