0

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


    }

提前致谢!

4

2 回答 2

2

不,它不会。在这样的呼叫之后,您正在“释放”的地址实际上会丢失。你怎么会知道特定的内存块再次可用于分配?

在这方面已经有很多研究,这里有一些概述 - Dobbs 博士的快速内存分配

编辑0:

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

于 2011-01-12T04:02:16.733 回答
0

一些事情:

  1. 你在哪里分配内存dictionary
  2. 你如何分配dictionary->addr指向的内存?如果没有您的代码,malloc则看不到您free是否可以工作。
  3. 除非在您的malloc函数中,您正在遍历进程可用的每个内存地址以检查它是否未被您dictionarydictionary[i].addr=NULL.

顺便说一句,当用户在一个据称未分配的指针上调用 free 时printf,您的版本中的函数free会打印出来,对吗?Remember to free!那为什么要“记得免费”呢?

编辑:

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

于 2011-01-12T04:14:07.250 回答