【问题标题】:Redefining free memory function in C在 C 中重新定义空闲内存函数
【发布时间】: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 将任何内容返回到免费商店,因此您会导致所有客户端泄漏大量内存。
  • 重新定义 mallocfree 这样的函数是一项乏味的工作。我以前做过很多冒险的事情,但我想我从来没有走到这一步。
  • 是的,对不起,我忘了添加已经实现的 malloc 函数。已编辑。
  • 哦,伙计!你对sbrk() 大错特错...

标签: c free redefine


【解决方案1】:

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

在这方面已经有很多研究,这里有一些概述 - Dobbs 博士的Fast Memory Allocation

编辑 0:

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

【讨论】:

  • 好点,我必须验证可用性,感谢您的参考。
【解决方案2】:

几件事:

  1. 你在哪里为dictionary分配内存?
  2. 你如何分配dictionary-&gt;addr指向的内存?如果没有 malloc 的代码,您的 free 是否可以工作是不可见的。
  3. 除非在您的malloc 函数中,您正在检查进程可用的每个内存地址以检查它是否未被您的dictionary 使用,否则仅分配dictionary[i].addr=NULL 不会“释放”内存,绝对不能留着重复使用。

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

编辑:

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

【讨论】:

  • 我认为使用flag变量是没有必要的
  • 是的,我编辑了问题并添加了malloc函数,并且“记住免费”的评论只是我草稿中的一个引用,供我自己测试编译的程序嘿嘿。
猜你喜欢
  • 2012-09-18
  • 2015-03-21
  • 1970-01-01
  • 2012-06-19
  • 2014-04-06
  • 2014-03-14
  • 2011-03-19
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多