自定义内存分配器

eat*_*mon 4 c memory arrays pointers memory-management

我写了一个自定义内存分配器.它有2个限制,我想删除所以它的工作方式类似malloc/free.

1.)mem_free调用需要为其输入参数强制转换为unsigned char*.我希望它采用任何类型的指针.如何才能做到这一点?

2.)我写的内存分配器在缓冲区的前面分配了一块内存,并且还写入了它的大小.free函数删除缓冲区中最后一块已分配的内存.所以malloc/free调用的顺序很重要或者它不起作用.如何删除此限制?

希望能够做到这一点:

char* ptr1 = mem_alloc(10);
char* ptr2 = mem_alloc(4);

mem_free(ptr1);
mem_free(ptr2);
Run Code Online (Sandbox Code Playgroud)

现在必须这样做:

char* ptr1 = mem_alloc(10);
char* ptr2 = mem_alloc(4);

mem_free(ptr2);
mem_free(ptr1);
Run Code Online (Sandbox Code Playgroud)

码:

unsigned char* mem_alloc(unsigned int size) {
    unsigned int s;
    if( (size + MEM_HEADER_SIZE)  > (MEM_MAX_SIZE - mem_current_size_bytes) ) {
        return NULL;
    }
    if(is_big_endian() == 0) {
        s = (mem_buff[3] << 24) + (mem_buff[2] << 16) + (mem_buff[1] << 8) + mem_buff[0];
    } else {
        s = (mem_buff[0] << 24) + (mem_buff[1] << 16) + (mem_buff[2] << 8) + mem_buff[3];
    }
    memcpy(mem_buff + mem_current_size_bytes, &size, sizeof(unsigned int));
    unsigned char* result = mem_buff + (mem_current_size_bytes + MEM_HEADER_SIZE);
    mem_current_size_bytes += MEM_HEADER_SIZE + size;
    return result;
}

void mem_free(unsigned char* ptr) {
    unsigned int i,s;
    for(i=0; i<mem_current_size_bytes; i++) {
        if( (char*)ptr == (char*)(mem_buff + i) ) {
            if(is_big_endian() == 0) {
                s = (*(ptr - 1) << 24) + (*(ptr - 2) << 16) + (*(ptr - 3) << 8) + *(ptr - 4);
            } else {
                s = (*(ptr - 4) << 24) + (*(ptr - 3) << 16) + (*(ptr - 2) << 8) + *(ptr - 1);
            }
            mem_current_size_bytes-=s;
            mem_current_size_bytes-=MEM_HEADER_SIZE;
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Goz*_*Goz 5

1)使用void*代替.
2)将地址映射存储到已分配的块和未分配的块的单独映射.然后,您可以在分配的映射中查找正在释放的块,将其删除,然后将块添加到未分配的映射(确保将其与任何一侧的任何空闲块合并).当然,这可能而且确实会导致内存碎片,但实际上这是不可避免的.