2011-02-04 10 views
2

main(例:mymalloc())以外の関数内で割り当てられたメモリを解放する方法をお勧めしますか?プログラムのさまざまな機能を無料で呼び出すことはできますか?あるいは、私たちはmyalloc()にメモリを割り当てたので、myalloc()自体の中でメモリを解放する必要がありますか? 以下を実装するより良い方法があるかどうかをご提案ください。mallocとフリーラッパーの使用


int main(int argc, char ** argv) { 
    int * arr = {0}; 

    foo(); 
    return 1; 
} 

void mymalloc(int ** myarr1) { 
    (*myarr1) = (int*) malloc(sizeof(int)*25); 
    (*myarr1)[3] = 69; 
} 

void myfree(int ** myarr2) { 
    if (*myarr2) { 
    memset(*myarr2, 0, sizeof(int)*25); 
    free(*myarr2); 
} 

void foo() { 
    int * arr1 = {0}; 

    mymalloc(&arr1); 
    printf("car[3]=%d\n",arr1[3]); 
    myfree (&arr1); 

    // Check if memory was freed 
    if (arr1) { 
    printf("ERROR: Memory allocated to arr1 is not freed."); 
    exit (1); 
    } 
} 

出力:
ERROR:ARR1に割り当てられたメモリが解放されません。

+0

'test.cの:20:エラー:宣言されていない'(最初にこの関数で使用)「ARR」。 – ulidtko

+0

@ulidtko:ありがとう。今修正されました。私は何をしようとしているのかを知るためにコードを入力しました。 – MemoryLeak

+1

ところで、あなたが安全なコードを書いていない限り、 'free'を使う前にメモリをクリアする必要はありません。 –

答えて

1

同じ関数内でmallocとfreeを呼び出す必要はありませんが、私はあなたのコードにいくつかの発言を持っている:

  1. なぜ別々の機能を使うのか?
  2. myfreeのmemsetは役に立たず、ポインタはとにかく無効になります。
  3. ポインタに{0}を割り当てることは無意味です。なぜならmallocはこれらを上書きするためです。
+0

@Patrik:私は自分のコードでmallocを何度か呼び出すので、main()をきれいにして短く、別々の関数にしたいと思っていました。私が変数を初期化しないと、私のコンパイラが騒ぎます。私は別の変数名でコードを更新して私の質問について明確にした。上記のコードは 'foo'の' arr1'に割り当てられたメモリを解放しますか?または 'malloc'が' mymalloc'の 'myarr1'で行われたので、' myarr1'を解放する必要がありますか? – MemoryLeak

+0

ポストは変更されましたが、メモリをいくつかのマーカー値に変更すると、オーバーランバグを追い出すために役立ちます。 –

+0

@ Martin:ありがとう、マーティン。それは私が最初にそこに持っていた意図でした。私はそれを削除したので、皆さんは@Patrikの発言に対する私の主な質問に集中することができます。 – MemoryLeak

2

freemallocで作成したものは、プログラム内の任意の場所に保存できます。

mallocで割り当てられたメモリは、メモリの "ヒープ"セクションから得られ、freeで解放されない限り、プログラムの存続期間中存続します。

0

メモリは正しく解放されますが、フリーコールではポインタがnullに設定されません。ポインタは現在は無効なアドレスを指しています。空き領域の後でarr1に何かを書き込もうとすると、arr1がnullを指していなくても、セグメンテーション違反が発生します。あなたは常にnullにポインタを設定しなければならない理由です

ちょうど解放した後、それ