ヒープメモリとは正確には何ですか?
mallocが呼び出されるたびに、ヒープと呼ばれるものからメモリが割り当てられます。ヒープは正確にはどこにありますか。メインメモリ内のプログラムは、プログラムステートメントが存在する命令セグメント、グローバルデータが存在するデータセグメント、およびローカル変数と対応する関数パラメータが格納されるスタックセグメントに分割されていることを知っています。さて、ヒープはどうですか?
ヒープメモリとは正確には何ですか?
mallocが呼び出されるたびに、ヒープと呼ばれるものからメモリが割り当てられます。ヒープは正確にはどこにありますか。メインメモリ内のプログラムは、プログラムステートメントが存在する命令セグメント、グローバルデータが存在するデータセグメント、およびローカル変数と対応する関数パラメータが格納されるスタックセグメントに分割されていることを知っています。さて、ヒープはどうですか?
ヒープは、プロセスのアドレス空間の一部です。ヒープは拡大または縮小できます。brk(2)
またはを呼び出して操作しますsbrk(2)
。これは実際にmalloc(3)
行うことです。
ヒープからの割り当ては、呼び出し元のルーチンが戻った後も保持されるため、スタックにメモリを割り当てるよりも便利です。したがって、たとえばfuncA()
、ルーチンを呼び出して、大量のメモリを割り当てて何かで埋めることができます。funcA()
その記憶は戻った後も有効です。funcA()
ローカル配列を (スタック上に) 割り当てた場合、funcA()
戻ったときにスタック上の配列はなくなっています。
ヒープを使用することの欠点は、ヒープに割り当てられたメモリを解放するのを忘れると、メモリを使い果たしてしまう可能性があることです。ヒープに割り当てられたメモリを解放できないこと (たとえば、 からfree()
メモリを取得できないこと) は、メモリ リークmalloc()
と呼ばれることがあります。
ヒープのもう 1 つの優れた機能は、スタック上のローカル配列/構造体/その他のものを割り当てるだけではなく、割り当てが成功したかどうかを示す戻り値を取得することです。スタックにローカル配列を割り当てようとして不足しても、エラー コードは表示されません。通常、スレッドは単に中止されます。
ヒープは、スタックの正反対です。ヒープは、動的に使用できる大きなメモリ プールです。「フリー ストア」とも呼ばれます。これは、自動的に管理されないメモリです。(malloc などの関数を使用して) 明示的に割り当て、メモリの割り当てを解除 (解放など) する必要があります。使い終わったときにメモリを解放しないと、いわゆるメモリ リークが発生します。つまり、メモリはまだ「使用中」であり、他のプロセスでは使用できません。スタックとは異なり、通常、ヒープ (またはヒープが作成する変数) のサイズには、マシン内のメモリの物理サイズ以外の制限はありません。ヒープ上に作成された変数は、プログラムのどこからでもアクセスできます。
ああ、ヒープメモリではポインタを使用する必要があります。
ヒープの要約:
クラフトオブコーディングの功績
基本的に、プログラムのニーズによってメモリが消費された後に残るのはヒープです。C では、コンピューターで使用可能なメモリになりますが、仮想マシンではそれよりも少なくなります。
ただし、これは、プログラムが動的にメモリを必要とするため、実行時に使用できるメモリです。
詳細については、これを参照してください。