C++ newとは?動的メモリ確保 delete

C言語でも動的メモリ確保、管理ができたように
C++でも可能です。

しかし、標準ライブラリ関数を使うのではなく、
新しく導入されたnew演算子delete演算子をペアで使います。

newとdeleteの使い方

int* ip = new int;            // int型領域を1つ確保

delete ip;                    // 確保したint型領域を解放

double* dp = new double;      // double型領域を1つ確保

delete dp;                    // 確保したdouble型領域を解放

char* cp = new char[10];      // char型配列を10個確保

delete [] cp;                 // 確保したchar型配列を解放

mydata* myp = new mydata;     // 独自データ型領域を1つ確保

delete myp;

このプログラム例では、
new演算子とdelete演算子の使い方を示しています。

new演算子は、確保した領域の先頭ポインタを返します。

配列を解放する場合は、
少し変わった記述が必要なので、良く覚えておきましょう。

delete演算子について

new演算子とdelete演算子はペアで使う事になっています。

そのため、例えば、C言語のmalloc関数で確保した領域を
delete演算子で解放しようとしたり、
new演算子で確保した領域を
C言語のfree関数で解放できないようになっています。

また、delete演算子に中身がNULLのポインタを指定しても
何も起こらない(暴走したりしない)ように保証されています。

スポンサーリンク

new演算子のエラー処理

new演算子によるメモリ確保が失敗した場合のエラー処理方法は、
戻り値がNULLであるかどうか。
それに加えて、例外処理によるエラー処理があります。

どちらなのかはコンパイラの実装に依存します。

1.戻り値がNULLの場合

int (*ip) = new int;

if (ip == NULL) エラー処理;

2.例外処理の場合

try {
      int (*ip) = new int;
}
catch (bad_alloc) {
      エラー処理;
}

C言語の動的メモリ確保とC++言語の動的メモリ確保の違い

C言語のmalloc系、free関数と、
C++のnew演算子とdelete演算子による
メモリ確保には次のような違いがあります。

1.newは、確保された領域のポインタが
何のデータ型であるか指定しなくて良い。
malloc系関数は、確保された領域のポインタがvoid*型で返すため、
何のデータ型であるか明示的にキャストする必要がある。

2.newは、データ型名、クラス名と配列の要素数を指定すれば、
確保するバイトサイズを自動計算してくれる。
malloc系関数は、
確保するサイズをsizeof演算子等で計算する必要がある。

3.newは、クラスのインスタンスを作る場合に
コンストラクタを呼んでくれる。
malloc系関数は、クラスのコンストラクタを呼んでくれない。
deleteは、クラスのデストラクタを呼んでくれる。
free関数は、クラスのデストラクタを呼んでくれない。

4.new、deleteは演算子である。
そのため、演算子のオーバーロードも可能である。
malloc系、freeは関数である。