2017-05-05 86 views
-1

同じ変数でmalloc()を何度も呼び出すとどうなりますか?以前に割り当てられたメモリを解放するにはどうすればよいですか?私はstruct iovecを使用してデータを格納する予定です(このチャンクを後で送信/書き込みできるように)。各mallocを呼び出す前に、現在の参照をiovec配列に保存したいと思います。これをした後、固定サイズの新しいメモリブロックを得るために同じ変数でmallocを呼び出します。使い果たされた後、私はiovec配列にそれを保存し、mallocをもう一度呼び出します。後でiovecアレイを解放することはできますか?これが適切なアプローチであるかどうか私に教えてください。mallocを複数回呼び出す

+0

代わりに 'realloc'を使用できますか? – RoiHatam

+0

あなたのコードを投稿してください。あなたが何を意味するかは分かりません。ポインタの配列を作成し、各配列を配列要素の1つに保存することができます。その後、配列をループしてそれらのすべてを解放することができます。 – Barmar

+0

@RoiHatam:私はreallocを呼びたくありません。なぜなら、このシナリオでは非常に高価な操作のようです。 – mehtame026

答えて

2

次のようなことをやっているようなあなたの説明に基づいて、それが聞こえる:

var = malloc(sizeof *var); 
do_something_with(var); 
vec[i++] = var; 
var = malloc(sizeof *var); 

それが本当ならば、これは大丈夫(モジュロエラーと健全性チェック)です - あなたは、参照を保存していますvarを上書きする前に、以前に割り当てられたメモリに割り当てます。あなたがvecfreeに各要素を巡回したい、あなたを完了したら:

while (i > 0) 
    free(vec[--i]); 

あなたが何かやっている場合:

var = malloc(sizeof *var); 
do_something_with(var); 
var = malloc(sizeof *var); 

を、あなたは問題を抱えている - あなたはあなたが上書きさしました以前に割り当てられたメモリのみを参照し、アクセスすることなくそのまま残すか、freeをメモリリークにつなぎます。

+0

すぐにお返事ありがとうございます。私は最初のアプローチに非常に似ています。私は固定長バッファを割り当てています。いっぱいになったら、この参照を保存してmalloc()をもう一度実行してください。 – mehtame026

+0

@ mehtame026:あなたは大丈夫でしょう。 –

+0

ありがとう@ジョン.. – mehtame026

関連する問題