内存可用时,Realloc()返回NULL
Realloc() returning NULL when memory is available
我有一个c++程序在具有12GB内存的Windows7机器上运行。编译器和链接器是Visual Studio 2013学习版。
该程序使用库OGDF。我使用X64版本配置将库源代码编译成一个静态库,并在我的项目中引用了该库。
当我运行该问题(调试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;
}
上面的代码运行正常(调试x64配置),任务管理器显示在我调用free()之前,我的内存使用量(工作集和提交的大小)约为2.3GB。所以在我的程序中,我可以在堆上分配超过2GB的内存,为什么库代码中的72MB分配失败了?
编辑:
我发现了问题。
当我使用发布配置编译的库文件时,调试器向我显示了错误的本地变量数据。实际原因是库正在调用realloc(ptr,0)。
你的问题与"你为什么不给我开一张500美元的支票?你银行里有2000美元。"
操作系统在使用内存之前会收到对内存的请求。操作系统不能批准内存分配请求,除非它有足够的后备存储来处理它已经允许的所有请求,无论它们当前是否使用任何RAM。
例如,如果您malloc
1GB,但尚未访问分配的虚拟地址空间,则该分配将使用远少于1GB的RAM。但是,在释放该分配之前,系统必须保留1GB的后备存储(RAM或交换),以防您的程序开始使用该分配的空间。
如果系统有太多这样的分配,即使它有足够的空闲RAM,它也会拒绝新的分配。Windows不会过度承诺,因为如果这些映射以后需要比操作系统更多的后备存储,就有不得不强制终止应用程序的风险。
将来避免这些误解的一个好方法是避免单独使用"记忆"这个词。如果你的意思是RAM,说"RAM"或"物理内存"。如果你的意思是后备商店,说"后备商店"。如果您指的是地址空间,请说"虚拟内存"。
你说,"我有很多空闲内存,所以我应该能够分配内存。"这听起来很神秘。但是,如果你更准确地说,"我有很多空闲RAM,为什么我不能分配更多的虚拟内存(或备份内存)?",你就知道答案的一半了。
- 如何在映射中返回null
- 为什么返回 NULL 不会破坏函数?
- fopen 在 gdb 中返回 NULL
- 为什么要从main()返回NULL?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- Box2D World.GetBodyList() 返回 NULL,但 World 显然正在更新对象
- boost::p ython:PyErr_Fetch始终返回 NULL 回溯
- 如何在 Visual C++ 中从返回类型为 map 的函数返回 null?
- 如何在C++中返回Null作为引用
- 从模板化函数返回Null对象
- GDALOpen 在 GEOTiff 文件上返回 null
- PyThreadState_GET() 从 PyImport_GetModuleDict() 中返回 NULL
- (位图)LoadImage() 返回 NULL,GetLastError() 返回 0
- 在构造函数处将类对象强制转换为接口始终返回 NULL
- 如何为迭代器返回"null"值?
- 具有 4 个指针的节点的递归插入函数返回 null
- winAPI FindResource 仅在 DLL 中返回 NULL
- 使用 dlopen/dlsym 打开C++共享库 - dlsym 返回 NULL
- SetWindowsHookEx 在挂接到其他线程时返回 NULL
- 尚未归shared_ptr所有的实例的 shared_from_this() 总是返回 null?