物理メモリ<>仮想メモリ。
32ビットアプリケーションを実行している場合は、最大2 GBのメモリ(32ビットOS上)をアドレス指定できます。あなたのマシンにも32 GBの物理メモリがありますが、まだ2 GBに制限されています。 マシンに最小限の物理メモリがある場合(128 MBの物理メモリがある日を覚えているか)、他の多くのアプリケーションを実行している場合は、サイズが2 GB未満になることがありますすべてのアプリケーション間で分割されます)。
2 GBのメモリでも、130 MBの連続ブロックがない場合、130 MBの割り当てが失敗する可能性があります。 Windows Vista以降、DLLはランダムにアドレス空間(探す:ASLR)に広がっていますが、これは(私の経験では)メモリの断片化を引き起こすようです。
あなたの問題には、いくつかの解決策があります。
- あなたが実行しているシステムを制御している場合は、お使いのシステムのためのASLRを無効にすることができます。商用ソフトウェアを販売している場合は、これを行わないでください。あなたの顧客はこれを受け入れません。
- 32ビットアプリケーションが64ビットシステムで実行されている場合は、アプリケーションに/ LARGEADDRESSAWAREフラグを設定します(リンカーフラグまたはeditbinユーティリティを参照)。このフラグを使用すると、アプリケーションで2 GBの代わりに4 GBのアドレスを指定できるようになります。ポインタで「汚い」ものを実行していないと確信している場合(例えば、無関係なポインタに引くなど)にのみこれを行います。
- 1つの大きなブロックの代わりに小さなメモリを割り当てます。 1つの大きなブロック(たとえば、この大きなブロックの周りにクラスを書くこと)が必要であるという事実を抽象化します。
可能であれば、私は最後の選択肢に行きます。
OSは、連続したメモリが使用可能であることを確認します(ただし、時間がかかります)。あなたが記憶の不足に苦しんでいることはほとんどありません。割り当て方法を教えてください:いくつかのコードを投稿してください。 – Raveline
Windows、linux、osx?各OSには(時々)設定可能な制限があります。管理者または一般ユーザーの場合Thomsk。 – RedX
例外をトリガするコードは非常に簡単です。 mesh-> tris = new Triangle [mesh-> numTris];値mesh-> numTrisは約5600000です.OSはWindows XPです。 –