C++動的メモリ割り当て
C++における動的メモリ割り当てについて
new演算子とはdelete演算子
C++では動的メモリ管理の機能として、「new演算子」と「delete演算子」が用意されています。
new演算子はメモリ領域を確保します。
変数へのポインタ = new 変数の型;
delete演算子は割り当てたメモリ領域を解放します。
delete 変数へのポインタ;
mallocとfreeについて
C言語で動的にメモリを割り当てるのによく用いられるmalloc()関数などをC++で使用することも可能です。
しかし、new演算子があるため、利用する機会はほとんどありません。
malloc/freeと比較した場合のnew/deleteの利点は以下のようなものがあります。
- メモリ確保時にsizeof演算子を用いてサイズ計算を行う必要がないこと。
- newは常に正しい型のポインタを返すので、キャストする必要がないこと。
- メモリ確保時に初期化が行える。(配列は除く)
newによる初期値の設定
new演算子は確保した領域は、初期化することが可能です。
変数へのポインタ = new 変数の型(初期値);
ただし、配列を確保した場合には初期化はできません。
自前でstd::fill_nなどを利用して初期値を設定する必要があります。
動的メモリ割り当ての例
C++のメモリ確保はC言語よりも簡潔に記述することが可能です。
int型の領域確保
C言語の場合、確保するメモリサイズを指定し、キャストする必要があります。
int *p = (int*)malloc(sizeof(int));
free(p);
C++の場合、型によって自動的に領域分のメモリを確保できます。
int *p = new int;
delete p;
構造体の領域確保
C言語の構造体の領域確保では以下のようになります。
struct _data{
int n;
char ch;
};
typedef struct _data data_t;
data_t *p = (data_t *)malloc(sizeof(data_t));
free(p);
C++の構造体の領域確保では以下のようになります。
なお、C++ではtypedefを記述せずにデータ型を扱うことが可能です。
struct data{
int n;
char ch;
};
data *p = new data;
delete p;
配列の領域確保
C言語における配列の領域確保では以下のようになります。
char *cp = (char *)malloc(sizeof(char) * 10);
free(cp);
C++における配列の領域確保では以下のようになります。
newは、配列のメモリ領域を確保する場合、添え字分の領域を確保します。
なお、delete(メモリ解放)の際には「[]変数名」という形式で指定する必要があります。
char *p = new char[10];
delete []p;
関連ページ
- C++のファイル作成と実行
- 関数
- 名前空間
- 参照型
- 動的メモリ割り当て
- キャスト
- 例外処理
- クラス
- コンストラクタとデストラクタ
- 継承
- ポリモーフィズム
- テンプレート
- STL
- 文字列操作
- 演算子のオーバーロード