malloc()
に戻りNULL
、設定errno
する状況がありますENOMEM
。ただし、CRT ヒープ (拡張可能) には、使用できる十分なメモリがあります。の時点でmalloc
、私のプロセス メモリは約 900 MB です。ホスト プロセスは、Sun HotSpot JVM の下で実行される Java 実行可能ファイルです。
malloc()
私がやっているのは80メガバイトで、失敗します。60 MB の割り当てを行うと、成功します。その後、50 MB の割り当てに続いて別の割り当てが行われ、別の割り当ても成功します。明らかに、まだ多くのメモリが残っていますが、80 MB の malloc は OS が消化するには大きすぎるようです。
4 GB RAM の Windows 7 x64 SP1 を使用しています。私のプロセスは、VC++ 2010 SP1 で構築された 32 ビット プロセスです。Win 7 のデフォルトである Low Fragmentation Heap を使用しています。HeapQueryInformation でも確認しました。私が使用している VC2010 C ランタイムは、次の方法でヒープを作成します。
HeapCreate(0, BYTES_PER_PAGE, 0)
のドキュメントによると、HeapCreate
は512KB を超えるブロックHeapAlloc
を自動的に呼び出します。VirtualAlloc
malloc()
これがメモリ不足でない場合、一体何が失敗する可能性がありますか? 私の記憶はあまりにも断片的ですか?Windows はヒープを自動的に圧縮すると思っていました。これは本当に奇妙です。私はこれまでにこの動作を見たことがありません。
Windows XP SP3 32 ビットを搭載した別のコンピュータが同じ動作を示しています。
ありがとう、マーティン