C言語編でmalloc関数とfree関数を使った動的メモリ確保を説明しました。
C++では、関数ではなく命令として動的メモリ確保が出来るようになっています。
キーワードは「new」と「delete」です。
まずは、変数を1つ確保して解放するプログラムを書いてみます。
<sample program cpp026-01>
#include <iostream> int main() { int *p = NULL; p = new int; if (!p) { return 1; } *p = 12; std::cout << *p << std::endl; if (p) { delete p; p = NULL; } return 0; } |
<実行結果>
12 続行するには何かキーを押してください・・・
基本的な考え方は変わりません。
動的に確保したメモリのアドレスはポインタ変数で受け取ります。
C言語ではmalloc関数でメモリを確保していましたが、newは次のように書きます。
p = new int; |
キャストも不要になり、sizeofも書かなくてよくなりました。
これでintサイズ1つ分の領域を確保し、アドレスをポインタ変数pに入れました。
当然、確保できなかった事も考えエラーチェックは必要です。
確保した領域を使用するのもポインタ変数の前に「*」を付ければよいので、C言語と変わりません。
解放は、delete命令で行います。
安全な解放コードを書いていますが、これもC言語編で説明した通りです。
※C言語編ではポインタ変数の初期値を設定していませんでしたが、NULL(無効なポインタ)を入れておきます。
構造体の確保も何も変わりません。
<sample program cpp026-02>
#include <iostream> struct Player { int hp; int mp; }; int main() { Player *p = NULL; p = new Player; if (!p) { return 1; } p->hp = 100; p->mp = 50; std::cout << p->hp << std::endl; std::cout << p->mp << std::endl; if (p) { delete p; p = NULL; } return 0; } |
<実行結果>
100 50 続行するには何かキーを押してください・・・
確保した後は、普通のポインタ変数として扱えば良いだけです。
気を付けるところは、ここではなく配列の確保の時にあります。
次回は配列の確保を説明します。