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

いいえ、それはしません。「解放」しているアドレスは、そのような呼び出しの後、事実上失われます。特定のメモリ チャンクが再び割り当て可能になったことをどのようにして知ることができるでしょうか?

この分野では多くの研究が行われてきました。ここにいくつかの概要があります - Dr. Dobbs のFast Memory Allocation 。

編集 0:

あなたは間違っていますsbrk(2)-それは「より良いmalloc」ではなく、そのように使用することはできません。そのシステム コールは、プロセス データ セグメントの終了を変更します。

于 2011-01-12T04:02:16.733 に答える
0

いくつかのこと:

  1. のメモリをどこに割り当てますdictionaryか?
  2. dictionary->addr指しているメモリをどのように割り当てますか? あなたのコードがなけれmallocば、あなたがうまくいくかどうかは見えませんfree
  3. malloc関数内で、プロセスで使用可能なすべてのメモリ アドレスを調べて、それが で使用されていないかどうかを確認しない限り、dictionary割り当てだけでdictionary[i].addr=NULLはメモリが「解放」されず、再利用のために保持されません。

ところで、printfあなたのバージョンの関数は、割り当てられていないと思われるポインターでユーザーが free を呼び出したときにfree出力されますよね? Remember to free!では、なぜ「解放することを忘れない」のでしょうか。

編集:

したがって、そのmalloc機能では、いいえ、あなたfreeはメモリを解放しません。まず第一に、メモリのアドレスが失われているため、これを呼び出すたびに、malloc実際にはプロセス ブレークをもう少し進めており、解放されたメモリの場所を再利用することはありません。これを解決する 1 つの方法は、「解放」した場所を何らかの方法で追跡して、次にmalloc呼び出されたときに、プロセスに十分なメモリが割り当てられているかどうかを確認し、それらの場所を再利用することです。また、これは高価なシステム コールでsbrkあるラッパーであることを忘れないでください。使用している OS から大量のメモリが要求されるように最適化してから、使用している部分と使用可能な部分を追跡する必要があります。brkmallocsbrk

于 2011-01-12T04:14:07.250 に答える