動的メモリ管理

スポンサーリンク

動的メモリ管理

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;
スポンサーリンク