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