5

(ユーザー入力に応じて) 多数の小さなオブジェクトを潜在的に割り当てることができるアプリケーションがあります。場合によっては、アプリケーションがメモリ不足になり、事実上クラッシュすることがあります。

ただし、メモリの割り当てが厳しくなっていることがわかっている場合は、破棄できる優先度の低いオブジェクトがいくつかあるため、ユーザーの結果を適切に低下させることができます。

「new」の呼び出しが実際に失敗する前に、プロセスのメモリが不足していることを検出する最良の方法は何ですか? GetProcessWorkingSetSize()orのような API 関数を呼び出すこともできますGetProcessMemoryInfo()が、特定のマシンの制限に達したとき (最大割り当ての 80% など) をどのように知ることができるでしょうか?

4

3 に答える 3

5
  • 起動時に、メモリ予約を割り当てます。
  • 次に set_new_handler() を使用して、割り当ての失敗を検出するフックをインストールします。
  • 1 つが発生した場合:
    • 予約を解放します (作業に十分な空きメモリを確保します)。
    • 優先度の低いオブジェクトを見つけて解放するコードを実行します。
    • 作業が完了したら、(次回のために) 予約の再割り当てを試みます。
    • 最後に、元の割り当て試行を再試行できるように戻ります。
于 2012-08-12T14:21:46.477 に答える
2

32 ビット プロセスの場合は、プロセスに許可されている最大容量である 2.0GB の 80% である 1.6GB を超えないようにする必要があります。呼び出しGlobalMemoryStatusExによって struct が埋められMEMORYSTATUSEX.ullAvailVirtualます。これが 400MB (またはそれ以下) しか利用できない場合は、しきい値に達しています。

于 2012-08-12T12:45:36.767 に答える
0

この回答を確認してくださいWin32/MFC: How to find free memory (RAM) available? .

利用可能な空きメモリを定期的に見つけて、ある制限で割り当てを停止する必要があります。上記の回答で説明したようにGlobalMemoryStatusEx、および/または を使用できますVirtualQueryEx

于 2012-08-12T12:29:00.723 に答える