【问题标题】:custom malloc function for cc的自定义malloc函数
【发布时间】:2018-11-15 21:16:29
【问题描述】:

我尝试用 c 编写自己的自定义 malloc 和 free 函数。我为此工作了大约 12 个小时,并尝试了很多东西。但它不起作用。 也许你们可以找出错误。分配的内存从列表中删除,带有指向特定地址的 next 指针,以便稍后在 free 函数中识别它。当前错误是拆分方法中的分段错误 11。 C文件:

头:

#define MAGIC ((void*)0xbaadf00d)
#define SIZE (1024*1024*1)

typedef struct mblock {
    struct mblock *next;
    size_t size;
    char memory[];
}mblock;

char memory[SIZE];

static struct mblock *head;

malloc:

void *halde_malloc (size_t size) {
    printf("Starting\n");
    printf("%zu\n",size);
    if(size <= 0) {return NULL;}
    if(head == NULL){
        initializeBlock();
        printf("Memory initialized\n");
    }
    mblock *temp_block = head;
    while(temp_block != NULL) {
        printf("IN\n");
        if(temp_block->size == size) {
            list_remove(temp_block);
            temp_block->next = MAGIC;
            return (void*)(temp_block);
        } else if(temp_block->size > size) {
            size_t temp_size = temp_block->size;
            printf("size IS more than equal\n");
            list_split_AND_Remove(temp_size - size, temp_block);
            temp_block->size = size;
            temp_block->next = MAGIC;
            return (void*)(temp_block);
        }
        temp_block = temp_block->next;
        printf("One block checked\n");
    }
    errno = ENOMEM;
    return NULL;
}

初始化:

void initializeBlock(){
    printf("Initializing\n");
    head = (mblock*)memory;
    head->size=sizeof(memory)-sizeof(mblock);
    head->next=NULL;
}

拆分:

void list_split_AND_Remove(size_t size, mblock *lastBlock) {
    printf("Split\n");
    mblock *new = (void*)((mblock*)lastBlock+size+sizeof(mblock));
    new->size = size - sizeof(mblock);
    new->next = lastBlock->next;
    lastBlock->next = new;
    printf("START REMOVE");
    list_remove(lastBlock);

}

删除:

void list_remove(mblock *p) {
    printf("Remove\n");
    mblock *temp_block = head;
    if(p == head) {
        if(head->next == NULL) {
            head = NULL;
            return;
        } else {
            head = p->next;
            return;
        }
    }
    while(temp_block->next != NULL) {
        if(temp_block->next == p) {
            printf("Found P:");
            temp_block = p->next;
            return;
        }
        temp_block = temp_block->next;
    }

}

免费:

void halde_free (void *ptr) {
    printf("FREE\n");
    mblock *new_block = ptr;
    if(new_block->next == MAGIC) {
        new_block->next = head;
        head = new_block;
    } else {abort();}

}

【问题讨论】:

  • “不起作用”具体是什么意思?你如何引发不当行为,它是如何表现出来的?
  • 这时候我在split方法中遇到了segmentation fault 11。
  • 那些sizeof很可疑
  • 任何尝试实现自己的malloc() 的人都应该足够先进,知道如何使用调试器和valgrind。
  • 你没有连接任何东西。您只是分配给一个局部变量,当您在下一行 return 时,它将超出范围。

标签: c malloc free


【解决方案1】:

您的代码问题包括但不一定限于:

  • list_remove() 实际上不会从列表中删除指定块,除非它恰好是当前列表头。因此,在所有其他情况下,halde_malloc() 在修改节点的 next 指针时调用 list_remove() 后会破坏列表。

  • list_split_AND_Remove() 执行不正确的指针运算。具体来说,mblock *new = (void*)((mblock*)lastBlock+size+sizeof(mblock)); 并没有做你想做的事情,因为指针算术以指向类型大小的单位进行运算,而 size 参数和 sizeof 运算符的结果具有个体单位字节。 (此外,这两种演员都是无用的,尽管它们本身无害。)

  • 你的分配器返回一个指向块头的指针,而不是它的数据。结果,用户很可能会覆盖块头的内容,从而在您稍后尝试释放该块时造成严重破坏。

  • 您似乎认为mblock 对象的对齐要求为 1。这可能不是真的。

【讨论】:

    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 2012-08-08
    • 2012-09-21
    • 2016-05-07
    • 1970-01-01
    • 2014-10-14
    相关资源
    最近更新 更多