2017-02-15 10 views
0

私は球面を細かく分割して球面ウェーブレットアルゴリズムを実装しようとしています。私は8GBのメモリを利用できますが、20面体の場合、9分割レベルに制限されています。私の問題は、メモリが十分にある場合でも私の球を構築している間、メモリ不足とbad_alloc例外です。私はたくさんのメモリを持っていますが、bad_alloc

私は、アドレス可能なメモリポインタを使い果たしてしまい、Win32アプリケーションで4GBという限界に達すると思っていました。しかし、あなたが見ることができるように、私は約1.9GBで限界に達しました。

このエラーは、使用しているシステムとは関係ありません。

Out of Memory (Screenshot)

誰もが起こったとどのようにこの種の問題に対処するために何を知っていますか?

+0

これは、オブジェクトが割り当てようとしていた大きさによって異なります。オブジェクトが連続したメモリ(例えば、 'std :: vector')を使用する場合、利用可能なメモリの*連続ブロックが必要であることに注意してください。そのため、使用可能なメモリが1 GBあり、0.75 GBのブロックを要求したとしても、それは連続した* 0.75 GBのブロックが使用可能であるという意味ではありません。 – CoryKramer

+0

related/dupe:http://stackoverflow.com/questions/5686459/what-is-the-maximum-memory-available-to-a-c-application-on-32-bit-windows – NathanOliver

答えて

3

これは、32ビットプロセスで利用可能なメモリ領域全体であるため、4GBを割り当てることはできません。これには、コードやその他のデータが含まれます。実行可能ファイルが他のブロックを割り当てない場合でも、ランタイムライブラリやスタックをサポートするものがあります。

Windowsでは、バイナリをLARGEADDRESSAWAREフラグとリンクすることによってのみ、2GB以上を割り当てることができます。 MSDNのドキュメントには簡単な説明情報があります。

この制限は、アプリケーションを64ビットの実行可能ファイルとして構築することで回避できます。ただし、64ビットWindowsマシンのみを対象とすることができます。

特定のWindowsバージョンhereのメモリ制限に関する背景があります。 32ビットで動かない場合は、PAEが役に立ちます。

+0

うわー、ありがとう。それが私の問題を解決しました。私はこのフラグがないと32ビットアプリケーションが2 GBのメモリキャップにバインドされているのを知らなかった。 –

+0

私は64ビットの実行可能ファイルとして私のアプリケーションを構築しようとしていますが、現時点で私は削除または置き換える必要があるいくつかの32ビットの依存関係があります。 –

関連する問題