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;

関連ページ