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

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

【Linux】mallocが失敗すると?

この記事は「渡部 Advent Calendar 2025」の20日目の記事です。


結論

malloc が失敗すると NULL を返す。 何も起きないわけではなく、「何も確保されなかった」という状態になる。

malloc が失敗する条件

malloc(size) は、次のような条件で失敗します。

  • 要求サイズを満たす 連続した仮想アドレス空間 が確保できない
  • OS やランタイムの制限に引っかかる

代表的な例としては以下があります。

  • プロセスの仮想メモリ上限(ulimit -v)
  • cgroup / コンテナの memory limit
  • メモリの断片化(巨大な連続領域が取れない)
  • overcommit 無効(vm.overcommit_memory=2)

失敗したときに何が起きるか

C 標準としての挙動

void *p = malloc(1024);
if (p == NULL) {
    // 失敗
}

失敗した場合、必ず NULL が返る。errno は 未規定(当てにしてはいけない)

ここで p を使った瞬間

*p = 1;  // ← 未定義動作(ほぼ確実に SEGV)

malloc が失敗しているのに、その戻り値を使った瞬間、プログラムは 未定義動作 に突入します。(SEGVする)

まとめ

malloc が失敗すると NULL を返す。でも 成功しても安全とは限らない。実際に死ぬのは「メモリを触った瞬間」。Linux / コンテナ環境では OOM killer による突然死 が起きる。低レイヤを触るなら、

  • malloc の失敗」より
  • 「成功したあとに何が起きるか」

を常に意識しておく必要があると思います。