私のプログラムでは、演算子 new を使用して約 130 メガバイトを割り当て、例外がスローされますが、タスク マネージャーで 800 メガバイト以上が使用可能であることがわかりました。タスク マネージャーで使用可能として示されている物理メモリと、プログラムで使用できるメモリとの関係を知りたいです。
もう 1 つの理由は、メモリの断片化です。メモリ割り当てを要求すると、メモリが連続している必要があります。そのような連続したメモリが存在するかどうかを知る方法はありますか?
物理メモリ <> 仮想メモリ。
32 ビット アプリケーションを実行している場合は、最大 2 GB のメモリをアドレス指定できます (32 ビット OS 上)。マシンに 32 GB の物理メモリがある場合でも、2 GB に制限されます。マシンの物理メモリの量が最小限である場合 (128 MB の物理メモリがあった時代を覚えていますか?)、または他の多くのアプリケーションを実行している場合、サイズは 2 GB 未満になる可能性があります (ページ ファイル全体が必要です)。すべてのアプリケーション間で分割されます)。
2 GB のメモリがあっても、130 MB の連続したブロックが利用できない場合、130 MB の割り当ては失敗する可能性があります。Windows Vista 以降、DLL はアドレス空間全体にランダムに分散されており (ASLR を探してください)、(私の経験では) 多くのメモリの断片化を引き起こしているようです。
あなたの問題にはいくつかの解決策があります:
可能であれば、最後の選択肢を選びます。
私はあなたがWindowsを使用していると仮定しています。利用可能な RAM の量は、new がメモリを割り当てられるかどうかとは関係ありません。プロセスの仮想メモリで 130 MB の連続した仮想メモリ ブロックを使用できるかどうかによって異なります。RAM は、OS が非常に高速に読み書きできる限られたスクラッチ パッドと考えてください。ただし、探しているものがスクラッチで利用できない場合は、ディスクに移動してスクラッチ パッドに書き込みます。