んだ日記

ndaDayoの技術日記です

スタックとヒープについて調べてみた

こんにちわ、んだです。

業務ではPHPですが、低レイヤーも興味出てきまして、rustをお触り始めました。 rustのチュートリを進めていて、所有権の箇所でスタックとヒープが出てきて「??」となってしもたので 調べてまとめてみました。

メモリの4領域

スタックもヒープもメモリ領域の一つですが、メモリ領域には、4つあるらしい。 ということで、まずは4つのメモリ領域について、まとめてみます。

メモリ領域には以下の4つがあります。

  • テキスト領域(プログラム領域)
  • 静的領域
  • スタック領域
  • ヒープ領域

テキスト領域(プログラム領域)

1つ目は、テキスト領域。プログラム領域とも呼ぶことがある。

テキスト領域とは、機械語に翻訳されたプログラムを格納する場所。 プログラム領域と呼ばれる所以はここにあります。

テキスト領域に格納されたプログラムが1行ずつ実行されることで、プログラムが動く。

静的領域

2つ目は、静的領域。

静的領域には、グローバル変数やスタティク変数などが格納される。 「静的」という名前の通り。

スタック領域

3つ目は、スタック領域。 スタック領域は、関数呼び出しの呼び元の保管、ローカル変数の保管場所として使用される。 タスクを終了する、または関数から抜けると、スタックの内容も破棄される。

ヒープ領域

4つ目は、ヒープ領域。プログラムの実行につれて動的に確保されるメモリ領域。 データやオブジェクトなどの保存用に確保されている。例えば、C++JavaScriptで新しいオブジェクトを作る際にもヒープ上にオブジェクトが生成される。

スタックとヒープのメモリ確保と解放

では、次にスタックとヒープのメモリ確保と解放についてです。

スタック

スタックへのデータの格納と解放についてのプログラムは、コンパイラが自動で生成してくれるのでプログラムを書く上では意識しなくてもOK。 関数を抜けると自動的に解放されます。

ヒープ

ヒープは、プログラマが明示的に宣言して確保して解放しないといけない。 C言語では、malloc()でメモリ確保、free()で解放。的な感じ。

メモリの解放のし忘れを、メモリーリークと呼ぶ。

僕から以上。あったくして寝ろよ。

参考書籍