地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

mallocは失敗するのか

malloc(マロック, エムアロック)、free、calloc、reallocは、動的メモリ確保を行うC言語の標準ライブラリの関数である

mallocは必ず成功するとは限らない。利用可能な空き領域が無いと失敗するらしい。このご時世メモリ不足って話もあまり聞かないがユーザプログラムがメモリ確保を失敗するくらいメモリが無い状態ではそもそもシステムが停止しているだろう。

それでも何故確保時のエラーをユーザ側がプログラムに書くのだろうか

#include <stdlib.h>

/* 10個のintの配列のためのメモリを確保 */
int *ptr = malloc(sizeof (int) * 10);
if (NULL == ptr) { //このifは必要?
    exit(EXIT_FAILURE);
} else {
    /* 確保成功 */
    free(ptr);
    ptr = NULL; 
}

このプログラムでmallocに失敗した際は何もせずにプロセスを終了している いるのだろうか?

Linuxにはmemory overcommit(オーバーコミット)と呼ばれる仕組みがある。 メモリ割り当ての段階では仮想アドレス空間を割り当て実際に使われる段階で実メモリを割り建てる仕組みだ。 例えば下記のようなプログラムを書いてみる

#define BLK_NUM 100
#define BLK_SIZE (100 * 1000 * 1000) /* 100MB */
 
int
main(int argc, char* argv[])
{
  int i;
  char* blk[BLK_NUM];
 
  for (i = 0; i < BLK_NUM; i++) {
    blk[i] = malloc(BLK_SIZE);
    assert(blk[i] != NULL);
  }
 
  return 0;
}

ただただメモリ領域を確保してメモリについて一切操作をしないプログラム メモリ8GBのマシンで実行してもmallocは失敗することはない。 何故なら仮想メモリのみが割り当てられるだけで実メモリを消費しないからだ。