在C中重新定义可用内存功能

时间:2011-01-12 03:56:45

标签: c free redefine

我正在重新定义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");
        }


    }

提前致谢!

2 个答案:

答案 0 :(得分:2)

不,它不会。在这样的电话会议之后,你“解放”的地址实际上已经丢失了。您怎么知道特定的内存块可以再次分配?

在这个领域已经有很多研究,这里有一些概述 - 在{Dobbs博士的Fast Memory Allocation

编辑0:

你错了sbrk(2) - 它不是“更好的malloc”,你不能这样使用它。该系统调用会修改流程数据段的结尾

答案 1 :(得分:0)

少数事情:

  1. 您在哪里为dictionary分配内存?
  2. 如何分配dictionary->addr指向的内存?如果您的malloc无法使用free,则无法显示该代码。
  3. 除非在您的malloc函数中,您正在查看流程可用的每个内存地址,以检查dictionary是否未使用该地址,但只有作业dictionary[i].addr=NULL会不要“释放”内存,绝对不要让它重复使用。
  4. BTW,当用户在一个据称未分配的指针上调用free时,printf版本中的free函数将打印Remember to free!,对吗?那为什么“记得自由”?

    修改

    因此,使用malloc函数,不,您的free不会释放内存。首先,你丢失了内存的地址,因此每次调用这个malloc时,你实际上都会进一步推动进程中断,并且永远不会重用已释放的内存位置。解决此问题的一种方法是以某种方式跟踪已“释放”的位置,以便下次调用malloc时,您可以检查是否已为该进程分配了足够的可用内存,然后重用这些内容位置。另外,请记住sbrkbrk的包装,这是一个昂贵的系统调用,您应该优化malloc,以便使用{{1}从操作系统请求大块内存然后只是跟踪你正在使用哪个部分,以及哪个部分可用。