2016-06-28 10 views
1

RAMから所定の数のGBを割り当てるアプリケーションを開発しようとしています。 1GBのRAMを割り当てようとすると問題なく動作しますが、1GBを超えるとクラッシュします。1GB以上のメモリ割り当てエラー

私はWindows 7 - 64bitを使用していますが、6GBのRAM(Installed Memory)があります。 (msvcr120d.dllを0x0F993FD4で

初回例外:私はQtのと、このアプリケーションを開発し、私は2013年

コードはここにあるのVisual Studioを使用しています:

int size = 1024 * 1024 * 1024; 
m_Size = ui.CPUAllocationEntry->text().toInt(); 


m_Arr =(char*) malloc(sizeof(char)*size*m_Size); 
memset(m_Arr, 1, size*m_Size); 
if (m_Arr == NULL) 
{ 
    qDebug() << "Pointer Null" << endl; 
} 
else 
    qDebug() << "Pointer NOT null" << endl; 

return; 

し、エラーがあります)ttool.exe:0xC0000005:0x00000000の場所を記述するアクセス違反。

ttool.exeの0x0F993FD4(msvcr120d.dll)で未処理の例外が発生しました。0xC0000005:0x00000000というアクセス違反の書き込み違反。

私はこれを32ビットアプリケーションとして試してみましたが、64ビットアプリケーションも試しましたが、結果は同じでした。また、私は/ LARGEADRESSAWAREリンカのオプションを試しました。しかし、私は解決策を見つけることができませんでした。

私はそれがどれくらいのRAMを使用しているのか知っていますが、3.02GBのRAMを使用して2GBを割り当てようとするとクラッシュします。

どうすればこの問題を解決できますか?

+0

'memset'は条件の下にある必要があります。少なくとも、それはクラッシュせず、 'Pointer Null'を印刷しません。 – LogicStuff

+4

利用可能なメモリがあまりない可能性があります。 – molbdnilo

+0

かなりのメモリリークが発生したアプリケーションを作成し、1GB以上のRAMを取得した場合は、おそらくWindowsでクラッシュしてしまいます。これは、Windows 7 -64ビットで、マシンで4GBが利用可能でした。 – DrDonut

答えて

5

メモリが断片化しています。あなたは1GBの大きなブロック1つを求めていますが、そのようなブロックは利用できません。使用可能な512MBのブロックが10個あるかもしれませんが、それは十分ではありません。

+0

MBのチャンクに分割されました。ありがとうございました。 – user3035291

1

問題は、整数オーバーフロー(1024 * 1024 * 1024 * 2は32ビットのintで負の結果になる)の原因となる乗算で、タイプがint(32ビット整数) 。

代わりにsize_tを使用する必要があります(お使いのOSはアプリの有無にかかわらず64ビットです)。