Manpages

名 前

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

書 式

#include <stdlib.h>

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

説 明

malloc() 関 数 は size バ イ ト を 割 り 当 て 、 割 り 当 て ら れ た メ モ リ ー に 対 す る ポ イ ン タ ー を 返 す 。 メ モ リ ー の 内 容 は 初 期 化 さ れ な いsize が 0 の 場 合 、 malloc() は NULL ま た は free() に 後 で 渡 し て も 問 題 の 起 こ ら な い 一 意 な ポ イ ン タ ー 値 を 返 す 。

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

calloc() 関 数 は size バ イ ト の 要 素 nmemb 個 か ら な る 配 列 に メ モ リ ー を 割 り 当 て 、 割 り 当 て ら れ た メ モ リ ー に 対 す る ポ イ ン タ ー を 返 す 。 メ モ リ ー の 内 容 は 数 値 ゼ ロ (全 ビ ッ ト が 0 の バ イ ト ) に セ ッ ト さ れ る 。 nmembsize が 0 の 場 合 、 calloc() は NULL ま た は free() に 後 で 渡 し て も 問 題 の 起 こ ら な い 一 意 な ポ イ ン タ ー 値 を 返 す 。

realloc() は 、 ポ イ ン タ ー ptr が 示 す メ モ リ ー ブ ロ ッ ク の サ イ ズ を size バ イ ト に 変 更 す る 。 領 域 の 先 頭 か ら 、 新 旧 の サ イ ズ の 小 さ い 方 の 位 置 ま で の 範 囲 の 内 容 は 変 更 さ れ な い 。 新 し い サ イ ズ が 前 の サ イ ズ よ り も 大 き い 場 合 、 追 加 さ れ た メ モ リ ー は 初 期 化 さ れ な いptr が NULL の 場 合 に は malloc(size) と 等 価 で あ る 。 size が 0 で ptr が NULL で な い 場 合 に は 、 free(ptr) と 等 価 で あ る 。 ptr が NULL 以 外 の 場 合 、 ptr は 以 前 に 呼 び 出 さ れ た malloc(), calloc(), realloc() の い ず れ か が 返 し た 値 で な け れ ば な ら な い 。 ptr が 指 す 領 域 が 移 動 さ れ て い た 場 合 は free(ptr) が 実 行 さ れ る 。

返 り 値

関 数 calloc() と malloc() は 、 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す 。 割 り 当 て ら れ た メ モ リ ー は 、 あ ら ゆ る 組 み 込 み 型 に 対 応 で き る よ う に ア ラ イ ン メ ン ト さ れ る 。 エ ラ ー の 場 合 、 こ れ ら の 関 数 は NULL を 返 す 。 size が 0 で 呼 び 出 し た malloc() や 、 nmembsize が 0 で 呼 び 出 し た calloc() が 成 功 し た 場 合 に も NULL が 返 さ れ る 。

free() 関 数 は 値 を 返 さ な い 。

realloc() 関 数 は 新 た に 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す 。 こ れ は あ ら ゆ る 組 み 込 み 型 に 対 応 で き る よ う に ア ラ イ ン メ ン ト さ れ て お り 、 ptr と は 異 な る こ と も あ る 。 割 り 当 て 要 求 に 失 敗 し た 場 合 は NULL が 返 る 。 size が 0 の 場 合 に は 、 NULL も し く は free() に 渡 す こ と が で き る ポ イ ン タ ー が 返 る 。 realloc() が 失 敗 し た 場 合 に は 、 元 の ブ ロ ッ ク は 変 更 さ れ な い 。 つ ま り 、 解 放 さ れ た り 移 動 さ れ た り は し な い 。

準 拠

C89, C99.

注 意

デ フ ォ ル ト で は 、 Linux は 楽 観 的 メ モ リ ー 配 置 戦 略 を 用 い て い る 。 つ ま り 、 malloc() が NULL で な い 値 を 返 し て も 、 そ の メ モ リ ー が 実 際 に 利 用 可 能 で あ る こ と が 保 証 さ れ な い 。 シ ス テ ム が メ モ リ ー 不 足 状 態 に な っ た と き 、 メ モ リ ー 不 足 解 決 器 (OOM killer) に よ っ て 一 つ ま た は 複 数 の プ ロ セ ス が 削 除 さ れ る 。 詳 し い 情 報 は 、 proc(5)/proc/sys/vm/overcommit_memoryproc/sys/vm/oom_adj、 お よ び Linux カ ー ネ ル の ソ ー ス フ ァ イ ル の Documentation/vm/overcommit−accounting を 参 照 の こ と 。 通 常 、 malloc() は 、 ヒ ー プ か ら メ モ リ ー を 割 り 当 て 、 必 要 に 応 じ て ヒ ー プ の サ イ ズ を sbrk(2) を 使 っ て 調 節 す る 。 MMAP_THRESHOLD バ イ ト よ り も 大 き な メ モ リ ー ブ ロ ッ ク を 割 り 当 て る 場 合 、 glibc の malloc() 実 装 は mmap(2) を 使 っ て プ ラ イ ベ ー ト な 無 名 マ ッ ピ ン グ (anonymous mapping) と し て メ モ リ ー を 割 り 当 て る 。 デ フ ォ ル ト で は MMAP_THRESHOLD は 128 kB だ が 、 mallopt(3) を 使 っ て 調 整 で き る 。 mmap(2) を 使 っ て 行 わ れ た メ モ リ ー 割 り 当 て は RLIMIT_DATA リ ソ ー ス 上 限 の 影 響 を 受 け な い (getrlimit(2) 参 照 )。 マ ル チ ス レ ッ ド ア プ リ ケ ー シ ョ ン で の デ ー タ 破 損 を 回 避 す る た め 、 内 部 で は mutexを 使 用 し て 、 こ れ ら の 関 数 で 利 用 さ れ る メ モ リ ー 管 理 用 の デ ー タ 構 造 を 保 護 し て い る 。 複 数 の ス レ ッ ド が 同 時 に メ モ リ ー の 確 保 や 解 放 を 行 う よ う な マ ル チ ス レ ッ ド ア プ リ ケ ー シ ョ ン で は 、 こ れ ら の mutex の 衝 突 が 起 こ り 得 る 。 マ ル チ ス レ ッ ド ア プ リ ケ ー シ ョ ン で の メ モ リ ー 割 り 当 て 処 理 に ス ケ ー ラ ビ リ テ ィ を 持 た せ る た め に 、 glibc で は mutex の 衝 突 が 検 出 さ れ た 際 に は 追 加 の メ モ リ ー 割 り 当 て 領 域 を 作 成 す る 。 追 加 領 域 の 各 々 は 、 (brk(2) や mmap(2) を 使 っ て ) シ ス テ ム に よ り 内 部 的 に 割 り 当 て ら れ た 大 き な 領 域 で 、 そ れ ぞ れ 独 自 の mutex に よ り 管 理 さ れ て い る 。

UNIX 98 標 準 で は 、 malloc(), calloc(), realloc() は 実 行 に 失 敗 し た と き に errnoENOMEM に 設 定 す る こ と に な っ て い る 。 Glibc で は こ れ が 守 ら れ て い る こ と を 仮 定 し て い る (ま た こ れ ら の ル ー チ ン の glibc バ ー ジ ョ ン は こ の こ と を 守 っ て い る )。 個 人 的 に 別 の malloc の 実 装 を 使 っ て い て 、 そ の malloc が errno を 設 定 し な い 場 合 に は 、 失 敗 し た 際 に errno に エ ラ ー の 理 由 を 設 定 し な い ラ イ ブ ラ リ ル ー チ ン が あ る か も し れ な い 。

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

malloc 実 装 は 、 環 境 変 数 で 動 作 を 調 整 で き る 。 詳 細 は mallopt(3) を 参 照 の こ と 。

関 連 項 目

brk(2), mmap(2), alloca(3), malloc_get_state(3), malloc_info(3), malloc_trim(3), malloc_usable_size(3), mallopt(3), mcheck(3), mtrace(3), posix_memalign(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。