メモリヒープとは何ですか?


回答:


234

おそらく、データ構造の観点からではなく、メモリ割り当ての観点からヒープを意味します(この用語には複数の意味があります)。

非常に簡単な説明は、ヒープ動的に割り当てられたメモリが常駐するメモリの一部であるということです(つまり、を介して割り当てられたメモリmalloc)。ヒープから割り当てられたメモリは、次のいずれかが発生するまで割り当てられたままになります。

  1. メモリはfree'd
  2. プログラムは終了します

割り当てられたメモリへのすべての参照が失われた場合(たとえば、ポインタへのポインタをもう格納しないなど)、いわゆるメモリリークがあります。これはまだメモリが割り当てられている場所ですが、メモリに簡単にアクセスする方法はありません。リークしたメモリは、将来のメモリ割り当てのために再利用することはできませんが、プログラムが終了すると、メモリはオペレーティングシステムによって解放されます。

これを、ローカル変数(メソッド内で定義されたもの)が存在するスタックメモリと比較してください。スタックに割り当てられたメモリは、通常、関数が戻るまでしか存在しません(これには、静的ローカル変数など、いくつかの例外があります)。

ヒープの詳細については、この記事を参照てください


3
ローカル変数はスタックにどのように存在しますか?スタックでは、非常に特定の順序で一度に1つの変数しか使用できません。スタックのどこかにあるローカル変数が必要な場合はどうなりますか?
CodyBugstein、2015

9
@Imray-静的に型付けされた言語では、ローカルパラメータのサイズはコンパイル時にわかります。したがって、ローカル変数は、アドレスオフセットを介してスタックから直接直接アクセスできます。これを行うためにスタックをポップする必要はありません。詳細については、この回答を参照してください。
LeopardSkinPillBoxHat 2015

17

メモリヒープは、ランダムアクセスでメモリを割り当てることができるメモリ内の場所です。メモリが非常に定義された順序で割り当てられて解放されるスタック
とは異なり、ヒープに割り当てられた個々のデータ要素は、通常、互いに非同期の方法で解放されます。プログラムが対応するポインタを明示的に解放すると、そのようなデータ要素は解放されます。これにより、ヒープが断片化する可能性があります。反対に、上部(またはスタックの動作方法に応じて下部)のデータのみが解放され、割り当てられた逆の順序でデータ要素が解放されます。


9

ヒープは、メモリが割り当てられたり割り当て解除されたりする領域であり、順序はありません。これは、new演算子または類似のものを使用してオブジェクトを作成するときに発生します。これは、メモリが先入れ先出し方式で割り当て解除されるスタックとは対照的です。


8

メモリヒープは、動的に割り当てられたメモリを保持するための一般的な構造です。ウィキペディアのDynamic_memory_allocationを参照してください。

他にも、プール、スタック、パイルなどの構造があります。


7

これは、プロセスで使用されているメモリマネージャによってオペレーティングシステムから割り当てられたメモリのチャンクです。malloc()次に、他への呼び出しは、オペレーティングシステムを直接処理する代わりに、このヒープからメモリを取得します。


7

おそらくメモリヒープではなく、ヒープメモリを意味します。

ヒープメモリは基本的に、実行中のプログラムがチャンクを要求できる(通常はプロセスごとの)大きなメモリプールです。これは通常、動的割り当てと呼ばれます。

「自動変数」が割り当てられるスタックとは異なります。したがって、たとえば、C関数でポインタ変数を定義すると、メモリアドレスを保持するのに十分なスペースがスタックに割り当てられます。ただし、多くの場合、ヒープに(mallocを使用して)動的にスペースを割り当て、このメモリチャンクが開始するアドレスをポインターに提供する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.