C/C++ ポインタ入門 > ポインタへのメモリ割り当て
Nobuhide Tsuda
Oct-2013
ポインタへのメモリ割り当て
- これまでは、ポインタが既に存在しているオブジェクトを指す例を説明したきた。
- 通常のアプリケーションでは、実行時に扱うデータ量に依って、動的にメモリを確保する必要がある。
- 例えば、テキストエディタであれば、オープンする文書サイズ分のメモリを必要とする
- メモリを動的に確保し、確保したアドレスをポインタに格納し、利用することができる
- C であれば、T *ptr = (T *)malloc(sizeof(型)) でメモリを割り当て、free(ptr) で割り当てられたメモリを解放する
- C++ であれば、T *ptr = new T でメモリを割り当て、delete ptr; で割り当てられたメモリを解放する
- 確保したメモリは不必要になったら解放しなくてはいけない。
- 不必要なメモリを貯めこむことをメモリリークと呼ぶ
- ただし、プログラム終了時には全てのメモリが自動的に解放される
malloc, free
- malloc を使うときは #include <stdlib.h> を記述する。
- malloc(バイト数) で指定したバイト数のメモリを確保し、そのアドレスを返す
- malloc() の型は void * なので、ポインタに代入する時はキャストを行う
int *ptr = (int *)malloc(sizeof(int));
複数のデータ分のメモリを一度に確保したい場合は、その個数倍のサイズを指定する
int *ptr = (int *)malloc(sizeof(int)*10); // int 型データ10個分のメモリを確保
確保したメモリが不要になった時は、free(ポインタ) によりメモリを解放する
int *ptr = (int *)malloc(sizeof(int)*10);
....
free(ptr);
確保されたメモリの内容は不定なので、明示的に初期化する必要がある
メモリ内容を0に初期化する void *calloc(int n, int sz) という関数もある
- calloc() で確保されたメモリの解放も free(ポインタ) で行う
malloc, free にはオブジェクトの初期化方法が提供されていないという問題があるので、
C++ では次に説明する new, delete を使う方がよい
演習問題:
- malloc() で int型のデータを10個確保し、内容を表示してみなさい
- 同様に、calloc() でメモリを確保し、その内容が0であることを確認しなさい
- malloc(1024*1025); を10000回繰り返し、メモリ不足になった時に何が起るか確認しなさい
new, delete
- 「new T()」で指定した型Tのオブジェクトが生成され、そのアドレスを返す
- new で生成したオブジェクトのメモリを解放する時は、「delete ポインター」と記述する。
int *ptr = new int(); // int 1個分の領域を確保
...
delete ptr; // 確保した領域を解放
型直後の () は省略可能
char, short, int などの単純な型(POD Plain Old Data)は () を付加すると 0 に初期化される。
() が無い場合、初期値は不定となる。
() 内に初期値を指定することが可能
int *ptr = new int(12); // int 型のメモリを確保し、12 で初期化
構造体、クラスを指定した場合、() を省略、または () だけの場合は、デフォルトコンストラクタが呼ばれる。
new T[個数] により複数のオブジェクトを一度に生成することが出来る。値は不定。
int *ptr = new int[5]; // int 型の領域5個分のメモリを確保
T がPOD であれば、new T[個数]() と記述すると値が0に初期化される。
- new T[個数](初期値) という指定は出来ないようだ。@VS2010 VC++
T *ptr = new T[個数] で生成したオブジェクトは delete [] ptr; で解放する。
演習問題:
- int 型データをひとつ new し、int *ptr がそこを指すようにし、直ぐに delete で削除しなさい。
- char 型データ100個を new で確保し、そのアドレスを char *ptr に設定し、直ぐに削除しなさい
- int 型データをひとつ、初期値 123 で new し、int *ptr がそこを指すようにしなさい。
中身が 123 であることを確認しなさい
- int 型データを new int[10] で生成し、中身を全部表示しなさい
- int 型データを new int[10]() で生成し、中身を全部表示しなさい
前:ポインタ移動
|上:C/C++ ポインタ入門
|次:ポインタと構造体・クラス