我有一个运行在Windows 7机器上的C++程序,内存大小为12GB。
编译器和链接器使用Visual Studio 2013 Express。
该程序使用OGDF库。 我使用Release X64配置将库源代码编译成静态库,并在我的项目中引用该库。
当我运行该问题(Debug x64配置)时,从OGDF库中的代码抛出异常,表明没有足够的可用内存;
我暂停了程序并打开了调试窗口,检查了 sNew = 9M 和 sizeof(E) = 8 的值,因此它正在分配 72M 的内存并失败了。
在调试时,我打开了 Windows 任务管理器,它显示我的程序的内存使用情况(工作集大小和已提交大小)小于 2MB。
因此,我非常困惑为什么 REALLOC 会失败,因为有足够的内存可用(>4GB)?即使我的堆中有很多碎片,已提交的大小也小于 2MB,所以应该有足够的内存。
为了测试目的,在调用库函数之前,我插入了以下代码:
上面的代码在Debug x64配置下能够正常运行,任务管理器显示我的内存使用量(工作集和分配大小)约为2.3GB,在调用free()函数之前。因此,在我的程序中,我可以在堆上分配超过2GB的内存。但是,为什么库代码中72MB的分配失败了呢?
编辑:
我找到了问题所在。
当我使用release-configuration编译的库文件时,调试器显示了错误的本地变量数据。实际原因是该库调用了realloc(ptr,0)。
该程序使用OGDF库。 我使用Release X64配置将库源代码编译成静态库,并在我的项目中引用该库。
当我运行该问题(Debug x64配置)时,从OGDF库中的代码抛出异常,表明没有足够的可用内存;
E *p = static_cast<E *>( realloc(m_pStart, sNew*sizeof(E)) );
if(p == 0) OGDF_THROW(InsufficientMemoryException);
我暂停了程序并打开了调试窗口,检查了 sNew = 9M 和 sizeof(E) = 8 的值,因此它正在分配 72M 的内存并失败了。
在调试时,我打开了 Windows 任务管理器,它显示我的程序的内存使用情况(工作集大小和已提交大小)小于 2MB。
因此,我非常困惑为什么 REALLOC 会失败,因为有足够的内存可用(>4GB)?即使我的堆中有很多碎片,已提交的大小也小于 2MB,所以应该有足够的内存。
为了测试目的,在调用库函数之前,我插入了以下代码:
void* ddd = malloc(1200000000);
char* b = (char*)ddd;
char ttt = 3;
int g = 0;
for (g = 0; g < 1200000000;++g)
{
*(b + g) = ttt;
}
ddd=realloc(ddd, 2400000000);
b = (char*)ddd;
for (g = 0; g < 2400000000; ++g)
{
*(b + g) = ttt;
}
上面的代码在Debug x64配置下能够正常运行,任务管理器显示我的内存使用量(工作集和分配大小)约为2.3GB,在调用free()函数之前。因此,在我的程序中,我可以在堆上分配超过2GB的内存。但是,为什么库代码中72MB的分配失败了呢?
编辑:
我找到了问题所在。
当我使用release-configuration编译的库文件时,调试器显示了错误的本地变量数据。实际原因是该库调用了realloc(ptr,0)。
_DEBUG
定义)。 - Eran