ヒープメモリって、そもそもナニ?

はじめに

プログラミングをしていると、よく耳にする言葉があります。それが「ヒープメモリ(Heap Memory)」。(Heapは英語で「山積み、堆積」などの意味)

でも、これって一体なんなんでしょう?なんだかむずかしそうな名前ですよね。
そこで今回は、コンピュータの「記憶の使い方」という観点から、ゆっくり見ていきましょう。

コンピュータの「机」と「引き出し」

まず、あなたが“プログラムを書く人”だとして、頭の中でこう想像してみてください。

あなたの目の前に「机」と「引き出し」があります。机の上では、今すぐ使うものを広げたり片付けたりします。
一方、引き出しには、あとで使う資料や一時的に保管したいものを入れておきます。

この「机」が、コンピュータでいうスタックメモリ(Stack Memory)であり、そして「引き出し」が、ヒープメモリ(Heap Memory)なんです。

スタックとヒープの違い

例えメモリの種類特徴
机の上スタックメモリすぐに使う物を置く、一時的。自動で片付く。
引き出しヒープメモリ長く使うデータを入れる。自分で入れて、自分で片付ける。

スタックメモリは、プログラムの関数を呼び出すたびに自動的に用意され、終わると勝手に片付けてくれる便利な領域です。
一方のヒープメモリは、自分で「使いたい」と頼んで確保し、いらなくなったら自分で片付けるというルールになっています。

ちょっとだけ専門家に

たとえばC言語などでは、ヒープメモリを使うときに malloc()(Memory allocation: メモリを確保する関数)を呼び、使い終わったら free()(メモリを解放する関数)を使います。

これを忘れると、「引き出しに物が溜まってパンパン」──つまりメモリリーク(メモリの無駄遣い)になります。
ゴミが溜まりすぎると、コンピュータの動きがだんだん重くなる、なんてことも。

じゃあ、なぜわざわざヒープを使うの?

そう聞くと、「じゃあ全部スタックでいいんじゃ?」と思うかもしれません。
でも、スタックには制限があります。

たとえば:

  • 一時的な関数の中でしか使えない
  • 大きなデータを置くには狭い
  • プログラムを抜けると消えてしまう

そんなときは、ヒープの出番です。
ヒープなら、「関数をまたいでデータを共有」したり、「好きなだけメモリを確保」したりできます。
つまり柔軟で、自由度が高いんです。

ヒープは自由。でも責任も伴う

ヒープメモリは、いわば「広くて自由な倉庫」。でも自由には責任がつきものです。

倉庫を借りっぱなしにして忘れてしまう──
つまり確保したメモリを解放しないと、倉庫代(メモリ)がどんどん増えてしまうのです。

最近の言語(Python、Java、C# など)は「ガベージコレクション(不要なメモリを自動で片付ける仕組み)」があるので、忘れても多少はなんとかしてくれます。
でも、仕組みを理解しておくことが、安定したプログラムを書く第一歩です。

まとめ

ヒープメモリを一言で表すなら「自分で管理する引き出し型メモリ」となりますね。

  • スタック:自動で片付く、すぐ使うための机の上
  • ヒープ:自分で使い、自分で片付ける、引き出しスペース

ヒープメモリを理解することは、「プログラムがどんなふうに記憶を使っているか」を理解する第一歩です。
少しずつ、プログラムの「頭の中」をのぞいてみましょう。