【发布时间】:2011-01-12 03:56:44
【问题描述】:
我正在重新定义 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");
}
}
提前致谢!
【问题讨论】:
-
free的哪些实现可能完全取决于您对malloc的实现。严格来说,重新定义任何一个都会产生未定义的行为,但是在没有定义所有malloc-family 函数的情况下重新定义它们会更糟糕,并且肯定会崩溃。我认为你需要澄清你在做什么以及你想要实现什么...... -
free的实现与malloc的实现密切相关。malloc在哪里?就目前而言,您不会使用free将任何内容返回到免费商店,因此您会导致所有客户端泄漏大量内存。 -
重新定义
malloc和free这样的函数是一项乏味的工作。我以前做过很多冒险的事情,但我想我从来没有走到这一步。 -
是的,对不起,我忘了添加已经实现的 malloc 函数。已编辑。
-
哦,伙计!你对
sbrk()大错特错...