C言語でも動的メモリ確保、管理ができたように
C++言語でも可能です。
しかし、標準ライブラリ関数を使うのではなく、
新しく導入された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演算子は、確保した領域の先頭ポインタを返します。
配列を解放する場合は、少し変わった記述が必要なので、良く覚えておきましょう。
多次元配列の確保
new演算子による多次元配列のメモリ確保は少しクセがあります。
int (*ip2)[3] = new int[2][3]; // 2次元配列確保
delete [] ip2;
int (*ip3)[3][4] = new int[2][3][4]; // 3次元配列確保
delete [] ip3;
|
確保したい領域は全て記述し、そのポインタを宣言する時は、
一番左の要素のところにポインタを宣言すればOKです。
非常に紛らわしいですが、確保する領域の要素数が決まっていれば
どんなポインタを宣言すれば良いか迷う事はないでしょう。
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は関数である。
スポンサードリンク
|