これは、私を長年悩ませてきたものです。
私たちは皆、学校で教えられています(少なくとも、私はそうでした)、割り当てられているすべてのポインタを解放する必要があるということです。ただし、メモリを解放しない場合の実際のコストについては少し気になります。malloc
ループまたはスレッド実行の一部の中で呼び出された場合など、いくつかの明らかなケースでは、メモリリークがないように解放することが非常に重要です。ただし、次の2つの例を検討してください。
まず、次のようなコードがある場合:
int main()
{
char *a = malloc(1024);
/* Do some arbitrary stuff with 'a' (no alloc functions) */
return 0;
}
ここで実際の結果は何ですか?私の考えでは、プロセスが終了してヒープ領域がなくなるため、呼び出しを逃しても害はありませんfree
(ただし、閉鎖、保守性、および適切な運用のためにそれをとることの重要性は認識しています)。私はこの考えで正しいですか?
次に、少しシェルのように動作するプログラムがあるとします。ユーザーはのような変数を宣言できaaa = 123
、それらは後で使用できるようにいくつかの動的データ構造に格納されます。明らかに、いくつかの* alloc関数(ハッシュマップ、リンクリストなど)を呼び出すソリューションを使用することは明らかです。この種のプログラムではmalloc
、これらの変数はプログラムの実行中に常に存在している必要があり、静的に割り当てられたスペースでこれを実装するための良い方法(私が見ることができない)がないため、呼び出し後に解放しても意味がありません。割り当てられているがプロセス終了の一部としてのみ解放されている大量のメモリがあるのは悪い設計ですか?もしそうなら、代替は何ですか?
free(a)
実際にメモリを解放するために実際には何もしないことを付け加えたいと思います!これは、mallocのlibc実装の一部のポインターをリセットするだけです。これは、mmapの大きなメモリーページ(一般に「ヒープ」と呼ばれます)内の使用可能なメモリーチャンクを追跡します。そのページは、プログラムが終了するときにのみ解放され、前に解放されることはありません。