Skip to content
Naoya Tech
Go back

How Memory Works: The Stack, the Heap and Pointers

17:46 OS & Low-level

Overview

This introductory video draws memory diagrams to show how programs use memory, and how stack overflows and memory leaks happen. It uses C on purpose, as a microscope rather than a language to master, because C exposes memory behavior most directly. Memory is a row of equally sized cells, each with an address. A variable name is just a human label for one, so always look at the name, address and value together.

Key Points

Chapters

概要

この入門動画では、メモリの図を一歩ずつ描きながら、プログラムがメモリをどう使うのか、そしてスタックオーバーフローとメモリリークがどう起きるのかを解説します。あえてC言語を使いますが、それは身につける言語としてではなく、メモリの動きがいちばんむき出しに見える「顕微鏡」としてです。メモリは同じ大きさの区画が1列に並んだもので、区画ごとにアドレスが振られています。変数名はその区画につけた人間用の名前にすぎないので、名前、アドレス、値の3つをいつもセットで見ることが大切です。

ポイント

  • スタックは後入れ先出し(LIFO)です。関数を呼ぶたびにローカル変数を置くフレームが積まれ、関数が終わると自動で取り除かれます。ただし、そのデータは関数より長くは生きられず、大きさもコンパイル時に決めておく必要があります。
  • mallocは実行時にヒープのメモリを確保してそのアドレスを返し、スタック上のポインターがそれを持ちます。データはfreeで解放するまで残ります。解放済みのアドレスを指したままのポインターはダングリングポインターと呼ばれ危険なので、NULLを入れておくのが定石です。
  • PythonやGo、TypeScriptでfreeを書かないのは、ガベージコレクションがそれを自動化し、どこからも指されていないヒープの領域を回収しているからです。
  • スタックオーバーフローは、止まる条件のない再帰などでフレームがスタックの上限(多くの環境でせいぜい数メガバイト)を超えて積み上がると起き、その場でクラッシュします。メモリリークは、解放していないヒープの領域を指す唯一のポインターが失われると起き、長時間動くサーバーのメモリをじわじわ食いつぶします。
  • ポインターが出てくると破綻する「変数は箱」という比喩の代わりに、スタックとヒープの両方について、アドレス、値、型、サイズの表を手で書くことを勧めています。

チャプター

Watch on YouTube

Share this post on:

Previous Video
How Git Works Internally: Blobs, Trees, Commits and Refs
Next Video
The CAP Theorem: An Introduction to Distributed Systems