malloc implementation?

前端 未结 3 1774
心在旅途
心在旅途 2020-11-29 23:58

I\'m trying to implement malloc and free for C, and I am not sure how to reuse memory. I currently have a struct that looks like this:

3条回答
  •  生来不讨喜
    2020-11-30 00:38

    I am borrowing code from Sylvain's response. He seems to have missed calculating the size of the free_block* ini calculating the overhead.

    In overall the code works by prepending this free_block as a header to the allocated memory. 1. When user calls malloc, malloc returns the address of the payload, right after this header. 2. when free is called, the address of the starting of the header for the block is calculated (by subtracting the header size from the block address) and that is added to the free block pool.

    typedef struct free_block {
        size_t size;
        struct free_block* next;
    } free_block;
    
    static free_block free_block_list_head = { 0, 0 };
    
    // static const size_t overhead = sizeof(size_t);
    
    static const size_t align_to = 16;
    
    void* malloc(size_t size) {
        size = (size + sizeof(free_block) + (align_to - 1)) & ~ (align_to - 1);
        free_block* block = free_block_list_head.next;
        free_block** head = &(free_block_list_head.next);
        while (block != 0) {
            if (block->size >= size) {
                *head = block->next;
                return ((char*)block) + sizeof(free_block);
            }
            head = &(block->next);
            block = block->next;
        }
    
        block = (free_block*)sbrk(size);
        block->size = size;
    
        return ((char*)block) + sizeof(free_block);
    }
    
    void free(void* ptr) {
        free_block* block = (free_block*)(((char*)ptr) - sizeof(free_block ));
        block->next = free_block_list_head.next;
        free_block_list_head.next = block;
    }
    

提交回复
热议问题