2017-05-01 15 views
-1

私の構造体の設定に割り当てられたすべてのメモリを解放する必要があります。私はセクションを追加したい場合は、私はこの私の構造体を解放する方法を見つけることができません

struct section * sect = malloc(sizeof(struct section) * 255); 
struct keysnvalues * keysnvalue = malloc(sizeof(struct keysnvalues) * 255); 

は、私が最初の1

sect[++num_section].name = buffer; // buffer is the name 

と次のセクションで

のためにこれを行うのですコードのbegginingで

struct keysnvalues { 
char* key; 
char* value; 
}; 

struct section { 
char *name; 
struct keysnvalues *keysnvalues; 
int keysnvalues_ammount; 
}; 

struct config { 
struct section *sections; 
int section_ammount; 
}; 

sect[num_section].keysnvalues = keysnvalue; 
sect[num_section].keysnvalues_ammount = num_keysnvalues; 
cfg -> section_ammount++; 

      //start with new keysnvalue 
num_keysnvalues = 0; 
keysnvalue = malloc(sizeof(struct keysnvalues) * 255); 
sect[++num_section].name = buffer; 
sect[num_section].keysnvalues = 0; 

私はこれはおそらく愚かな質問であることを承知していますが、私は可能性がhttps://pastebin.com/pGztJ9k4

:この

keysnvalue[num_keysnvalues].key = key; 
keysnvalue[num_keysnvalues++].value = value; 

全体のコードはここにあるん私は私で働いているキーとセクションに値を追加します今や何時間も構造全体を解放する方法を理解していない。

本当にありがとうございます。

+0

'free(keysnvalue);'? –

+3

私は、このコードだけではなく、もっと多くのことが起こっていると考えています。何かが私に「鍵」と言う。'value'、' name'も動的であり、ここの* all *の管理は、ここに描かれている単純化よりもはるかに複雑です。それにもかかわらず、[free()のドキュメント](http://en.cppreference.com/w/c/memory/free)は、どのように/いつ使用するのかについての良い洞察を提供します。 – WhozCraig

+0

@WhozCraigしかし、セクション[i] .nameでmallocを呼び出さないと、空き(セクション[i])だけで大丈夫でしょうか? – Martin

答えて

1

malloc()によって割り当てられている場合に限り、ポインタは通常free()になります。これを達成するには、メモリアドレスへのポインタを "緩め"ないようにする必要があります。以前の値をコピーしたり、以前に割り当てられたメモリを解放したりせずに、同じ変数に複数回割り当てます。

あなたが参照した完全なコードは分析されませんでした。 しかし、keysnvalueの値をのsect[i].keysnvaluesの前に現在のセクションにコピーしたようです。 したがって、あなたができるループを介して各セクションはのkeysnvalue独自のを取得しているようです、と:それはあなたがまたkey/value最終的に解放するためにループトラフに各sect[i].keysnvalueを持っている可能性があり

for (int i=0;i< num_section;i++) { 
    if (sect[i].keysnvalues != NULL) { 
     free(sect[i].keysnvalues); 
     // free(sect[i].name); // if buffer has also been malloced 
    } 
} 
free (keysnvalue); 
free (sect); 

は、プログラムの最後にfreeしようとしているセクションのメンバーは、常にどちらかのゴミポインタ値を「解放」からあなたのコードを防ぐためにNULLまたはmalloc ED値で初期化されていることを確認します。

0

次の 'malloc()'で 'keysnvalue'をリセットすると、は 'keysnvalue'の前の値へのポインタを上書きします。そのため、関連付けられたストレージにアクセスできない状態、つまり 'メモリリーク'が発生します([keysnvalue]の以前の値のコピーを別の場所に保持しない限り)。あなたが本当に新しいもので構造体を置き換えているならば、古いものを最初に解放し、次にmalloc()を次のものにする必要があります。最後まですべてをクリーンアップすることはできません。

個人的に私はそれをやりません - 新鮮な構造のために、私は 'memset()'を呼び出して既存の構造をゼロにします。

+0

したがって、基本的には "keysnvalue = malloc(sizeof(struct keysnvalues)* 255);"私はセクションに別のkeysnvalueを追加するたびに、私は自由にすることは不可能です()? – Martin

関連する問題