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は関数である。