動的メモリ割り当て

 C++ではローカル変数のメモリ割り当てが自動的に行われ、それらの
変数はスタックメモリに置かれる。スタックは一時的な変数や関数の引数には最適だが、
ローカル変数には適切ではない場合もある。
 第一に、スタックでは利用できるメモリの量に期限があり、平均的なプログラムで使いたいメモリ
の量よりも、ずっと少ないのが典型的だ。例えばMicrosoftのVisual C++ コンパイラでは、
デフォルトのスタックサイズは1MBである。たったこれだけでは、単純なゲームでない限り
不足である。
 第ニに、ローカル変数は保続期間が限られる。ローカル変数の利用できるのは、それが宣言
された時から、それを腹部スコープが終わるまでだ。典型的なスコープは、1つの関数内である
(グローバル変数は好ましいスタイルではない)。
 動的メモリ割り当て(dynamic memory allocation)では、プログラマーが変数のメモリ割
当てと割り当て解除を管理する。動的割り当てには、メモリの別領域であるヒープ(heap)
が使われる。スタックに比べて、ヒープはずっと大きく(現在のマシンでは数ギガバイト)、ヒープ
上のデータは、プログラムーがデータを削除するか、そのプログラムが終了するまで永続する。

 C++ではメモリをヒープに割り当てるのにnewを使い、割り当て解除にはdeleteを使う。
new 演算子を要求された型または変数のメモリを割り当て、クラスと構造体では、そのコンストラクタ
を呼び出す。
delete 演算子は、その逆に、クラス/構造体のデストラクタを呼び出し、変数のメモリ割当てを解除する。



 動的に割り当てたメモリのdeleteを忘れると、メモリリーク (memory leak)が発生する。
リークしたメモリは、プログラムの残りの存続期間で、そのメモリが再利用されずに残り続ける。
長時間実行されるプログラムでは、小さなメモリリークでも積み重なって、ついにはヒープのメモリ不足を
起こすことがある。もしもヒープのメモリが足りなくなったらそのプログラムがにクラッシュすることは、ほぼ確実だ。
 もちろん、ただ一つの整数を動的に割り当てても、ヒープの潤沢なメモリを活用することはできない。



 配列を動的に割り当てる時は方の直後に角かっこを置いて、その中に要素数を指定する。
配列を静的に割り当てる場合と違い、動的に割り当てる配列では実行時に要素数を指定できる。
 動的に割り当てた配列削除するには、delete[]を使う。



【戻る】