メモリ不足時の挙動まとめ

言語

C
  • malloc()がNULLポインタを返す
C++
  • malloc()がNULLを返す
  • newはbad_alloc例外を投げる。nothrowを指定するとNULLを返す
    • MFCの場合はCMemoryException例外
Java
  • OutOfMemoryException例外が投げられる
C#
  • OutOfMemoryException例外が投げられる
JavaScript
  • 未定義?

メモリ不足時の対処

  • メモリ不足時にはアプリを落とす、世の中の大半のアプリ
    • NULLが返る場合: 意図しない処理が実行されるのが問題。対策として、多くのコードにNULLチェックを入れるより、malloc()をラップしてNULLの場合にexit()するのがいい(OSがアプリ削除時に確保した領域を開放しないようなプラットホームは別)。
    • 例外を投げる場合: アプリは気にしないか、最上位でcatchして自分を終了する。
  • メモリ不足時に縮小運転などを行うアプリ(可能ならば下位でチェックするのではなく、上位で残存メモリ量を見て縮小運転に移行するのがいい)
    • NULLが返る場合: NULLチェックを全ての場所に入れて、整合性を保つための処理を行い、NULL(実際はメモリエラー用の返り値の場合が多い)を上に伝搬させていく。
    • 例外を投げる場合: 整合性を保つ必要のある場所全てで、OutOfMemoryExceptionをcatchして、処理を行い、伝搬させるのためOutOfMemoryExceptionを投げる。