ヒープ領域とは
ヒープ領域とは、動的に確保と解放を繰り返せるメモリ領域のことです。プログラムの実行時には、OSからソフトウェアに対して一定量のヒープ領域が与えられます。ソフトウェアは、必要に応じて任意にヒープ領域を確保・解放できます。
ヒープ領域はデータの仮置き場や、臨時の作業台のような存在といえるでしょう。基本的に利用し終わった領域は解放し、再び自由に使える状態にしておきます。
なお、ツリー状のデータ構造のこともヒープと呼びますが、それとは意味が異なるため気をつけましょう。またプログラミング言語によってヒープの意味が異なる場合もあります。たとえば、javaではヒープ領域上に確保したメモリ管理システムのこともヒープと呼びます。
以下の文章でヒープと表現する場合はすべてヒープ領域を指すものとします。
スタック領域とヒープ領域の違い
ヒープ領域とスタック領域は、どちらも一時的に確保されるメモリ領域です。両者はどう違うのでしょうか。
スタック領域:最後に確保した順に開放する
スタック領域は、確保したのとは逆の順番で解放するのが特徴です。たとえば、A、B、Cの順に確保した場合、解放するのはC、B、Aの順となります。下から積み上げた荷物を、上から取り除いていく様子をイメージするとわかりやすいでしょう。
また、スタック領域はコンパイラやOSによってソフトウェアへの割り当てを決めるのも特徴です。割り当ては、あるデータについて、保存が必要な期間だけメモリ領域を確保し、不要になったら解放するように行われます。
また、プログラムには「入れ子構造」が多く使われ、入れ子の内側ほどデータ保持の期間が短くなるので、スタック領域との相性が良いです。
ただし、ヒープ領域のように、ソフトウェアが任意に確保と解放を決められません。管理が容易ではありますが、必要に応じて柔軟に割り振りを決められないのが難点です。
ヒープ領域:任意の順序で確保・解放する
スタック領域が下から順番に積み上げていくのに対し、ヒープ領域には順序がありません。ヒープとは山積みという意味であり、その名のとおり領域を山積みにします。
つまり、どのような順序で確保・解放するかは、ソフトウェア側で自由に決められるということです。そのため、ヒープ領域は柔軟性が高いのが特徴です。
あらかじめどのくらいのデータ領域が必要なのか分からなくても、ソフトウェア側が必要に応じて対応できます。しかし、それらの判断をソフトウェアに任せることになる以上、全体の管理は難しくなります。
C言語でプログラムを作る場合は、Auto変数を使えばスタック領域が使えますので、スタック領域でも支障が生じないようであれば、そちらを採用したほうがよいでしょう。
開発に必要な開発ツールの製品を検討の際は、製品比較をしてみましょう。以下のランキングで製品の人気ランキングを紹介していますので、あわせてチェックしてみてください。
ヒープ領域の管理方法
続いて、ヒープ領域の管理方法を見ていきましょう。
「malloc」関数で領域を確保する
mallocとは、memory allocation(メモリ割り当て)のことです。つまり、malloc関数はどのくらいのメモリ領域をソフトウェアに割り当てるかを決める関数のことです。以下のように記述します。
malloc(確保したいメモリサイズ)
括弧の中に値を入れると、その容量だけヒープ領域を確保できます。たとえば、100バイトのヒープ領域を確保したい場合は以下のように記述します。
malloc(100)
これは基本的な型であり、実際には型を変えるための(char *)などが必要です。この関数は戻り値として、確保できたヒープ領域の先頭アドレスが得られます。
「free」関数で領域を解放する
malloc関数によって確保したヒープ領域は、必要なくなり次第解放しなければなりません。その際には、以下のように記述します。
free(先頭アドレス)
先頭アドレスとは、確保したヒープ領域の先頭部分のことです。これはmalloc関数使用時に戻り値として得られるアドレスを使います。一度の確保に対してfree関数を二度以上使わないよう注意しましょう。
解放したヒープ領域は、すでにほかのソフトウェアが利用している可能性があるためです。
「ガベージ・コレクション」で自動的に領域を管理する
ガベージ・コレクションとは、未開放のヒープ領域を回収する仕組みです。通常、確保されたヒープ領域はソフトウェア側の操作によって解放されます。
しかし、どれほど厳密にそれらの操作を行っても、解放されないままのヒープ領域が発生します。そのような放置されたヒープ領域が発生する問題を、メモリ・リーク(メモリの回収漏れ)と呼びます。
これではヒープ領域の空き容量が不足し、さまざまなソフトウェアで支障をきたすでしょう。まるでごみのように散在する未開放ヒープ領域を解放する仕組みが必要で、それがガベージ・コレクション(ごみ収集)です。
どのような変数やオブジェクトからも参照されていない領域をガベージと見なし、解放します。
ヒープ領域を利用する際に気を付けること
メモリを高速で使ううえでは、ヒープ領域はあまり好ましくありません。あらかじめ割り当てる容量や順序が決まっているスタック領域のほうがスムーズです。
また、ヒープ領域は容量を確保するのが難しいという問題もあります。確保する容量は各ソフトウェアが決めるため、複数のソフトウェアが全体で消費する容量を予測するのは困難です。そもそも、予測できるのであればスタック領域で事足ります。
つまり、ヒープ領域を使っていると、容量が枯渇するおそれがあるということです。
メモリ・リークの問題も相まって、予想以上の容量が消費され、ソフトウェアがクラッシュする可能性があります。ヒープ領域を使う場合は、それが枯渇しても問題ないように、予備のメモリを準備しておくなどの対策が不可欠です。
\ 開発ツール の製品を調べて比較 /
製品をまとめて資料請求!
資料請求フォームはこちら
ヒープ領域について理解し、データを効率的に保存しよう!
ヒープ領域とは、ソフトウェアが任意に確保と解放を繰り返せるデータ領域のことです。スタック領域とは異なり、あらかじめ割り当て容量は決まっていません。ヒープ領域の管理は以下のように行います。
- malloc関数
- 確保
- free関数
- 解放
- ガベージ・コレクション
- メモリ・リークへの対処
基本的に、スタック領域で済むならそちらを選びます。どうしても柔軟性が欲しい場合にヒープ領域を活用しましょう。
開発ツールを検討の際は、以下より資料請求も可能です。