MALLOC(3)

名前
calloc, malloc, free, realloc - 動的なメモリの割り当てと解放を行う

書式
#include <stdlib.h>

void *calloc(size_t nmemb, size_t size);
void *malloc(size_t size);
void free(void *ptr);
void *realloc(void *ptr, size_t size);

説明
calloc() は size バイトの要素 nmemb 個からなる配列にメモリを割り当て、割り当てられたメモリに対するポインタ を返す。メモリの内容は 0 にセットされる。

malloc() は size バイトを割り当て、割り当てられたメモリに対するポインタを返す。 メモリの内容はクリアされない。

free() はポインタ ptr が指すメモリ空間を解放する。このポインタは、以前に呼び出された malloc(), calloc(), realloc のいずれかが返した値でなければならない。 これ以外のポインタを指定したり、すでに free(ptr) が実行されていたりした場合の動作は定義されていない。 ptr が NULL の場合には、なんの動作も行われない。

realloc は、ポインタ ptr が示すメモリブロックのサイズを変更して size バイトにする。 新旧のサイズのうち、小さいほうのブロックに含まれる内容は変更されない。 新しく割り当てられたメモリの内容は初期化されない。 ptr が NULL の場合には、この呼び出しは malloc(size) と等価である。 size が 0 の場合には、この呼び出しは free(ptr) と等価である。 ptr は ( NULL でなければ)、以前に呼び出された malloc(), calloc(), realloc() のいずれかが返した値でなければならない。

返り値
calloc() と malloc() の返す値は、割り当てられたメモリへのポインタである。これは あらゆる種類の変数に適するようにアラインメントされている。 割り当て要求に失敗した場合は NULL が返る。

free() は値を返さない。

realloc() は新たに割り当てられたメモリへのポインタを返す。 これはあらゆる種類の変数に適するようにアラインメントされており、 ptr とは異なるかもしれない。 割り当て要求に失敗したり、 size が 0 だった場合には NULL が返る。 realloc() が失敗した場合には、元のブロックは変更されない。 つまり、解放されたり移動されたりはしない。

準拠
ANSI-C

関連項目
brk(2)

注意
Unix98 スタンダードでは、 malloc(), calloc(), realloc() は実行に失敗したときに errno を ENOMEM に設定することになっている。 Glibc ではこれが守られていることを仮定している (またこれらの ルーチンの glibc バージョンではこれらを守っている)。 もし個人的に実装した malloc を使い、その malloc が errno を設定しない場合には、 errno に理由を返さずに失敗するライブラリルーチンがあるかもしれない。

malloc(), free(), realloc() などにおける事故は、ほとんどの場合はヒープの破壊 (corruption) が 原因である。例えば割り当てられた領域をオーバーフローする、同じポインタ に二度 free する、などがこれにあたる。

最近のバージョンの Linux libc (5.4.23 以降) と GNU libc (2.x) では、 malloc の動作を環境変数によって制御できるような実装がされている。 MALLOC_CHECK_ が設定されていると、特殊な実装が用いられ、単純なエラー には耐えることができるようになる (効率は悪くなる)。例えば free() を同じ引き数で二度呼び出してしまう、 1 バイトだけ行きすぎてしまう (off-by-one バグ) などがこれに当たる。 しかしこれらのエラーの全てを防ぐことができるわけではなく、 その場合にはメモリリークが起こってしまう。 MALLOC_CHECK_ が 0 にセットされていると、ヒープの破壊を黙って無視する。 1 にセットされていると、診断メッセージが標準エラー出力に表示される。 2 にセットされていると、ただちに abort() が呼び出される。設定 2 が便利な状況としては、 実際のプロセスのクラッシュがずっとあとに起こり、本当の原因を探し出すの が非常に困難な場合などが挙げられるだろう。