2016-06-28 70 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位的,无论你的应用是否为)。