動的メモリ管理
スポンサーリンク
動的メモリ管理
C における動的メモリ管理には,次のように malloc 関数, free 関数を用いました。
int *p = malloc(sizeof(int));
// ...
free(p);
C++ では,new 演算子,delete 演算子を用いて同様の処理が可能です。
Class1* p = new Class1(a, b);
// ...
delete p;
対象のデータ型がクラス型 (class, struct) の場合には,new でコンストラクタ,delete でデストラクタが呼び出されます。
malloc 関数,free 関数では,コンストラクタとデストラクタは呼び出されないため,必ず new 演算子と delete 演算子を使用します。
コンストラクタが引数を持たない場合,括弧は省略できます。
Class1* p = new Class1;
// ...
delete p;
組込み型に対しても,new 演算子と delete 演算子を使うことができます。
int* p = new int;
// ...
delete p;
メモリを new で確保して delte で解放するまでに例外が発生する場合のある処理では,メモリリークが起きないように注意を払う必要があります。
次のようなプログラムの場合,p.func(); で例外が発生すると,delete p; が実行されないため,メモリリークが発生します。
Class1* p = new Class1(a, b);
p->func(); // この行で例外が発生すると
delete p; // この行は実行されない
配列の動的作成
配列の動的作成には,new[] 演算子,delete[] 演算子を用います。
int* arr = new int[size];
// ...
delete [] arr;
コンストラクタに引数を与えるには,new Class1[size] の代わりに new Class1[size](a, b) のように書きます。
Class1* arr = new Class1[size](a, b);
// ...
delete [] arr;
多次元配列の動的作成には,次のようにループによる処理が必要となります。
1 次元ずつ new[] および delete[] する必要があることに注意します。
int** arr = new int*[size_x];
for (int i = 0; i < size_x; ++i)
arr[i] = new int[size_y];
// ...
for (int i = 0; i < size_x; ++i)
delete [] arr[i];
delete [] arr;
スポンサーリンク