2012-04-23 12 views
3

私のプログラムでは、operator newを使用して約130メガバイトを割り当て、例外 がスローされますが、タスクマネージャで800メガバイト以上。 私は タスクマネージャで利用可能であると示された物理メモリと私のプログラムが使用できるメモリとの関係を知りたいと思っています。オペレータnewが大量の物理メモリを使用できる間に例外をスローする

もう1つの理由は、メモリの断片化です。メモリ割り当てを要求すると、メモリは が連続している必要があります。そのような連続したメモリが存在するかどうかを知る方法はありますか?

+1

OSは、連続したメモリが使用可能であることを確認します(ただし、時間がかかります)。あなたが記憶の不足に苦しんでいることはほとんどありません。割り当て方法を教えてください:いくつかのコードを投稿してください。 – Raveline

+1

Windows、linux、osx?各OSには(時々)設定可能な制限があります。管理者または一般ユーザーの場合Thomsk。 – RedX

+0

例外をトリガするコードは非常に簡単です。 mesh-> tris = new Triangle [mesh-> numTris];値mesh-> numTrisは約5600000です.OSはWindows XPです。 –

答えて

0

私はあなたがWindows上にいると仮定しています。利用可能なRAMの量は、newがメモリを割り当てるかどうかとは何の関係もありません。 130 MBの連続した仮想メモリブロックがプロセスの仮想メモリで利用可能かどうかは、依存しています。 RAMは、OSが非常に速く書き込みして読むことができる場所からの限られたスクラッチパッドと考えてください。しかし、それが探しているものがあれば、それはディスクに行くとスクラッチパッドに書き込みますスクラッチで利用可能ではありません。

+0

ありがとう、Naveen。 130 MBの連続した仮想メモリブロックがプロセスの仮想メモリで使用可能かどうかを知る方法はありますか?私は地球上で何が起こるか教えてくれる手がかりが必要です。問題を解決するために私は何をすべきですか? –

+0

これにはWin32 APIを使用する必要があります。 – Naveen

+0

@JoggingSong: 'VirtualQuery'と一緒に' GetSystemInfo'を使う必要があります。このデルファイコードを参照してください:http://stackoverflow.com/a/2356712/39742このCコードhttp://blog.kalmbachnet.de/?postid=9 – Naveen

4

物理メモリ<>仮想メモリ。

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つの大きなブロック(たとえば、この大きなブロックの周りにクラスを書くこと)が必要であるという事実を抽象化します。

可能であれば、私は最後の選択肢に行きます。

+0

また、仮想メモリを決して使用しないように真の64ビットプロセスにする欠けている: – Asha

+0

@Asha、もちろんもちろん。それは私がいつも忘れている最も明白なものです。 – Patrick

関連する問題