4章所有権と移動
メモリの管理に関しては、プログラミング言語に次の2つの特徴があることが望ましい。
- メモリが、プログラマが選んだタイミングで適切に解放されること。これによってプログラムのメモリ消費を制御できる。
- 解放済みのオブジェクトへのポインタを使ってしまうことがないこと。このようなことをすると未定義動作になり、クラッシュやセキュリティホールにつながる。
しかしこれらは相反するように思える。ポインタが存在するうちに値を解放すればそのポインタの参照する先がなくなってしまう。これをダングリングポインタと言う。メジャーなプログラミング言語のほとんどが、上の2つのどちらかをある程度諦めている。どちらを諦めるかで、次の2つのどちらの陣営に属するかが決まる。
- 「安全第一」陣営は、ガベージコレクションを用いてメモリ管理を行う。オブジェクトへ到達できるポインタがすべてなくなったところで、自動的にそのオブジェクトを開放する。こうすればダングリングポインタは発生しない。そのオブジェクトを指すポインタがなくなるまでオブジェクトを取っておくのだから当然だ。ほとんどすべての近代的な言語は、この陣営に属する。Python、JavaScript、Ruby、Java、C#、Haskellなどだ。しかし、ガベージコレクションに依存するということは、オブジェクトが解放される厳密なタイミングの制御をコレクタに明け渡すということだ。一般に、ガベージコレクタは恐ろしい野獣で、なぜ望んだタイミングでメモリが解放されなかったのかを理解することは非常に難しい。
- 「制御優先」陣営は、メモリ解放の責任をプログラマに委ねる。プログラムのメモリ消費は、完全にプログラマの掌中にあるが、同時にダングリングポインタを避ける責任もプログラマに課せられる。広く使われている言語で、この陣営に属するのはCとC++だけだ。 ...
Get プログラミングRust 第2版 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.