Cpp New演算子

提供:yonewiki

C++に戻る


本来の表記は「C++(Cpp) New演算子」です。この記事に付けられた題名はテンプレート:記事名の制約から不正確なものとなっています。

※このページではC++にのみ存在する機能として、記事タイトルがC++ New演算子になっています。

new演算子

new演算子は、ポインタ変数に対して、new演算子の後ろに設定する型でメモリを確保する命令です。配列のメモリ確保も出来ます。このようなメモリの確保は動的なメモリ確保と呼ばれます。int n;のように定義された通常の変数はプログラム中で変数宣言されたところから、名前空間が終了するまでメモリ確保がされます。静的なメモリ確保と呼びます。常に一定の大きさのメモリを消費します。対して、動的なメモリ確保では、プログラム中で任意の区間で繰り返しメモリの確保と解放を繰り返すことができ、メモリ確保のタイミングをプログラム側で制御することが出来ます。配列の大きさもプログラム動作時に任意の大きさで確保できるため、必要最小限のメモリ確保を行うように制御することも可能です。静的なメモリ確保では配列の大きさは予め決められた一定の大きさでしか設定できないため、不必要にメモリを大きく確保することが多くなります。new演算子によって確保されたメモリはdelete演算子によって解放処理を記述します。new演算子で確保したメモリがあってもdelete演算子によって解放をしない場合は名前空間の終了時に解放されます。

例1

  int *pnReturnValue = new int;

ポインタ変数は宣言された時点では、int型の変数のアドレスを保持する変数が確保されただけで、宣言された時点では具体的なアドレスも保持していないため、値を代入することはできません。new演算子によってint型の変数が生成され、具体的なアドレスを保持し、型の大きさだけメモリを確保されます。

例2

  int *pnReturnValue;
  pnReturnValue = new int;

例1のパターンを2ステップに分けて記述する場合は上記のような形式になります。1行目でポインタ変数を宣言して、2行目のようにポインタ変数に対してnew演算子を利用してメモリを確保します。

例3

  int nLength =strlen(pcStrOrigin)
  char *pcMessage;
  pcMessage = new char[nLength];

配列の確保は上記のように行います。動的なメモリ確保では、配列の大きさに変数を設定することができます。静的なメモリ確保を行う配列では、コンパイルエラーとなるような指定が可能です。

new演算子の後ろの型名に引数をつけるパターンもあり、この場合はコンストラクタが準備されていれば、引数に対応したコンストラクタが動作して初期化がなされます。引数を省略している場合はデフォルトコンストラクタが動作していると考えてよいでしょう。new演算子の後ろにはクラス名を記述することもできます。動的にクラス変数を生成することもできます。intの場合は引数に一つの整数値を付与することができます。したがって以下のようにnew演算子を使うことができます。

例4

  int *pnReturnValue = new int(100);

引数無しは以下のようにも記述できます。

例5

  int *pnReturnValue = new int();

もちろんコンストラクタが準備されていなければ、対応した引数を付与しない限りnew演算子による動的な変数の生成処理は失敗します。具体的には個々のクラスや型名の生成方法・コンストラクタに関する仕様書や説明書を参照して下さい。


new演算子は、演算子ですから、演算子のオーバロードをすることができます。以下のような関数に独自の機能を追加していけばよいです。但し、オーバロードした関数内ではC++の関数を使うとC++関数の中でnewが再び呼び出される可能性があるため、C++関数を使わないような工夫が必要です。C++関数を利用すると無限スタックが発生し、new演算子の呼び出しでプログラムが暴走します。

void* operator new(size_t sizeNew) {
  return malloc(sizeNew);
}
void operator delete(void* pDelete) {
    free(pDelete);
}


C++に戻る