2016-06-28 69 views
1

我想開發一個應用程序,它從RAM中分配給定數量的GB。當我嘗試分配1 GB的RAM時,它工作正常,但超過1GB,它崩潰。大於1GB的內存分配錯誤

我使用的Windows 7 - 64位,我有6 GB的RAM(安裝的內存)。我開發使用Qt這個應用程序,我使用Visual Studio 2013年

代碼是在這裏:

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; 

和錯誤是:

在0x0F993FD4第一次機會異常(msvcr120d.dll )在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

這也可能是Windows的一件事,一旦我寫了一個內存泄露很糟糕的應用程序,並且當它達到1GB以上的內存時,它崩潰了,大概是由Windows關閉的。這是在Windows 7 -64位上,機器中有4GB可用。 – DrDonut

回答

5

你的記憶被分割了。您要求提供1GB的大塊,但沒有可用的塊。可能有10個512MB的塊,但這還不夠好。

+0

分成大塊工作的MB。謝謝。 – user3035291

1

你的問題是,你使用的類型是int,這是一個32位整數,導致整數溢出(1024 * 1024 * 1024 * 2產生負值,結果爲32位int) 。

你應該使用size_t來代替(大概你的操作系統是64位的,無論你的應用是否爲)。