我正在重新定义C中的内存函数,我想知道这个想法是否可以作为free()函数的实现:
typedef struct _mem_dictionary
{
void *addr;
size_t size;
} mem_dictionary;
mem_dictionary *dictionary = NULL; //array of memory dictionaries
int dictionary_ct = 0; //dictionary struct counter
void *malloc(size_t size)
{
void *return_ptr = (void *) sbrk(size);
if (dictionary == NULL)
dictionary = (void *) sbrk(1024 * sizeof(mem_dictionary));
dictionary[dictionary_ct].addr = return_ptr;
dictionary[dictionary_ct].size = size;
dictionary_ct++;
printf("malloc(): %p assigned memory\n",return_ptr);
return return_ptr;
}
void free(void *ptr)
{
size_t i;
int flag = 0;
for(i = 0; i < dictionary_ct ; i++){
if(dictionary[i].addr == ptr){
dictionary[i].addr=NULL;
dictionary[i].size = 0;
flag = 1;
break;
}
}
if(!flag){
printf("Remember to free!\n");
}
}
提前致谢!
答案 0 :(得分:2)
不,它不会。在这样的电话会议之后,你“解放”的地址实际上已经丢失了。您怎么知道特定的内存块可以再次分配?
在这个领域已经有很多研究,这里有一些概述 - 在{Dobbs博士的Fast Memory Allocation。
你错了sbrk(2)
- 它不是“更好的malloc”,你不能这样使用它。该系统调用会修改流程数据段的结尾。
答案 1 :(得分:0)
少数事情:
dictionary
分配内存?dictionary->addr
指向的内存?如果您的malloc
无法使用free
,则无法显示该代码。malloc
函数中,您正在查看流程可用的每个内存地址,以检查dictionary
是否未使用该地址,但只有作业dictionary[i].addr=NULL
会不要“释放”内存,绝对不要让它重复使用。 BTW,当用户在一个据称未分配的指针上调用free时,printf
版本中的free
函数将打印Remember to free!
,对吗?那为什么“记得自由”?
修改强>
因此,使用malloc
函数,不,您的free
不会释放内存。首先,你丢失了内存的地址,因此每次调用这个malloc
时,你实际上都会进一步推动进程中断,并且永远不会重用已释放的内存位置。解决此问题的一种方法是以某种方式跟踪已“释放”的位置,以便下次调用malloc
时,您可以检查是否已为该进程分配了足够的可用内存,然后重用这些内容位置。另外,请记住sbrk
是brk
的包装,这是一个昂贵的系统调用,您应该优化malloc
,以便使用{{1}从操作系统请求大块内存然后只是跟踪你正在使用哪个部分,以及哪个部分可用。