スタック と ヒープ

メモリ:データやプログラムを一時的に記憶する。

メモリ領域の管理手法は大きく分けて、
スタック領域、ヒープ領域 がある。

 

スタック ( stack )

積み上げる、堆積物という意味。
データ領域を積み上げていくような形で管理する方式。
最後に確保した領域を最初に開放する。
( 上に積んで上から降ろす )

プログラムで使うデータの多くは使う範囲が決まっている。
データの利用される範囲のことを、スコープ ( scope ) と呼ぶ。

スコープが入れ子になっている時、
内側のスコープで使うデータ領域
後から確保し、先に解放されることになる。
http://ufcpp.net/study/computer/MemoryManagement.html
のスタック項目にわかりやすい図がある。

しかし、スコープが明確に分かっているデータに対してしか利用できない。

また、スタックに使う為のメモリ領域は
それほど大きくとらないのが一般的。
大きなデータ領域を一気に確保したい場合にもスタックは向いていない
このような場合、ヒープを用いる。

 

ヒープ ( heap )

塊、山積みという意味。
任意サイズのデータ領域を、任意の順序で確保 / 解放 する方式。
( スタックが整然と積み上げていくイメージ。
  ヒープは乱雑に山積み状態なイメージ )

以下のような場合に利用。

・データを必要とするスコープがはっきりしてない場合。
  ex) データがさまざまな箇所から参照されている場合

・実行時にしかサイズが確定しない場合。
  ex) 利用者からの入力に応じてサイズを変える必要がある場合。

・必要サイズがかなり大規模な場合。

 

 

ヒープ領域の管理

ヒープを利用する際、
用済みになったデータ領域の解放を忘れて
メモリ上に「ごみ」 ( いつまでたっても解放されない領域 )が
残ってしまうことがある。

これを問題をモリー・リーク ( 回収漏れの意味 ) と呼ぶ。

逆に、既に解放済みの領域を再度解放しようとして
問題を起こすことがあり、
こちらは二重解放と呼ばれている。

ヒープの管理下を自動化する手法の一つに、
ガベージ・コレクション というものがある。
ガベージ・コレクションは、定期的に「ごみ」になっている領域が
ないかどうかを調べ、見つけた「ごみ」を
開放して回る処理を行う。

 

こ ちらから。
http://ufcpp.net/study/computer/MemoryManagement.html

 

以上。