スカラー変数のメモリを動的に確保するためには new 演算子を使います。
ソースコードの中で変数を宣言すると、同時にそのデータを格納するためのメモリも確保されますが、逆に言うとソースコードの中で宣言しないとメモリは確保されないことになります。この方法には「宣言するだけで必要なメモリを確保することができる」というメリットがある反面「コンパイル時にはプログラムに必要な変数とその個数をすべてリストアップしておく必要がある」というデメリットがあります。
つまり、メモリを自動的に確保するためには、プログラムを書いている段階で必要な変数とその個数が完全に決まっている必要があるのです。しかし、敵キャラの情報を格納する配列変数などはステージによって必要なサイズが違うかもしれません。しかし、メモリを自動的に確保する方法では、ステージに応じて変数のサイズを変えることはできず、無駄な領域が生まれてしまう可能性があります。
この問題を解決するためにはメモリを動的に確保します。
プログラムの実行が開始された後に「必要に応じてメモリを確保する」ためには new 演算子を使います。 new 演算子には確保したいデータの型情報を渡します。
// メモリを確保する int *pointerOfInt = new int(); double *pointerOfDouble = new double();
new 演算子の戻り値はポインタになりますので、前述の例のようにポインタ変数で受け取ります。普通の変数は new 演算子の戻り値としては不適切です。なぜかというと普通の変数はすでにメモリが割り当たっているからです。
new 演算子によるメモリの確保は大変便利ですが一点だけ注意すべき点があります。それは「使い終わったメモリを解放しなければならない」ということです。もし、使い終わったメモリを解放しないで放置しておくとメモリリークを起こし、プログラムが異常終了する可能性が高くなります。
new 演算子によって確保したメモリを解放するためには delete 演算子を使います。
// メモリを解放する delete pointerOfInt; delete pointerOfDouble;
しかし、「 delete を自分で管理するのは面倒だなぁ」と感じられる方が大半かと思います。ご安心ください。 Boost というライブラリにスマートポインタという技術があります。スマートポインタを使うと delete を自分で実行する必要がありません。使われなくなったメモリを自動的にしてくれます。
本ブログでもそのうち取り上げますので楽しみにお待ちください。
Comments
[...] 基本はスカラー変数の場合と同じですが、配列の場合は書式が異なります。 // int と double でそれぞれ 100 個の要素を確保するとき int *pointerOfIntArray = new int[100](); double *pointerOfDoubleArray = new [...]
Contributions