私の質問は、C で free() を使用するのが適切な場合に関するものです。私は gcc 4.3.2 を使用しています。
リンクされたリストで大量のメモリの割り当てを解除する必要がある場合、それを行う理想的な方法は次のとおりです(私は推測しています):
int freeLL(node *a)
{
if(a->next != NULL)
freeLL(a->next);
free(a);
return 0;
}
ここで、次の ADT で同様のことを行うとします。
「頂点」と「エッジ」(たとえば)の2つのポインターを持つポインター「VertexNode」。次のように言うのと同じです:
struct vertexnode
{
vertex *v;
edge *e;
}
typedef struct vertexnode* VertexNode;
後で、インスタンスを初期化するときに、次のようにします-
VertexNode V = malloc(sizeof(struct vertexnode));
V->v = malloc(sizeof(vertex));
したがって、最終的に解放する際に、リンクされたリストに使用したのと同じアナロジーを使用しました。
free(V->v);
free(V);
これにより実行時エラーが発生し、「free(V->v)」をコメントアウトすると、プログラムは正常に動作しました。私の質問は次のとおりです。
a) free(V) を実行するだけで十分ですか? つまり、 free() は、特定のポインター内のすべてのポインターに対して再帰的に機能しますか?
b) そうでない場合、この場合、メモリ リークがありますか? そして、それを理想的に防ぐにはどうすればよいですか?
c) 最後に、malloc() によって割り当てられたバイト数と free() によって解放されたバイト数を追跡する方法はありますか?
長い質問で大変申し訳ありません。どうぞよろしくお願いいたします。