首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当内存可用时,Realloc()返回NULL

当内存可用时,Realloc()返回NULL
EN

Stack Overflow用户
提问于 2015-11-25 17:31:45
回答 1查看 319关注 0票数 4

我在一台12 on内存的Windows7机器上运行了一个c++程序。编译器和链接器是Visual Studio 2013速成版。

该程序使用库OGDF。我将库源代码编译为具有Release X64配置的静态库,并在我的项目中引用了该库。

当我运行这个问题()时,x64库中的代码抛出一个异常,表明没有足够的内存可用;

代码语言:javascript
复制
    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会失败,因为有足够的内存可用(>4 4GB)?即使我的堆中有很多碎片,提交的大小也不到2MB,所以应该有足够的内存。

为了测试propose,我在调用库函数之前插入了以下代码:

代码语言:javascript
复制
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.3 is。所以在我的程序中,我可以在我的堆上分配超过2 2GB的内存,为什么库代码中的72MB分配失败了?

编辑:

我找到问题了。

当我使用release-configuration编译库文件时,调试器显示了错误的局部变量数据。实际原因是库正在调用realloc(ptr,0)。

EN

回答 1

Stack Overflow用户

发布于 2015-11-25 17:39:56

你的问题非常类似于“你为什么不给我开一张500美元的支票?你在银行里有2000美元。”

在使用内存之前,操作系统会收到内存请求。操作系统不能批准内存分配请求,除非它有足够的后备存储来存储它已经允许的所有请求,无论这些请求当前是否正在使用任何RAM。

例如,如果您malloc了1 1GB,但是还没有访问分配的虚拟地址空间,那么该分配将使用少于1 1GB的内存。但是,在分配被释放之前,系统必须保留1 1GB的后备存储(RAM或交换),以防您的程序开始使用分配的空间。

如果系统有太多这样的分配,即使它有足够的空闲RAM,它也会拒绝新的分配。Windows不会过度使用,因为如果这些映射后来需要比操作系统拥有的更多的后备存储,则可能不得不强制终止应用程序。

在未来避免这些误解的一个好方法是避免使用“记忆”这个词本身。如果你指的是RAM,那就说"RAM“或”物理内存“。如果你指的是后备商店,那就说“后备商店”。如果你指的是地址空间,那就说“虚拟内存”。

您可以这样说:“我有很多空闲内存,所以我应该能够分配内存。”这听起来像是个谜。但是如果您说得更准确一些,“我有很多空闲的RAM,为什么我不能分配更多的虚拟内存(或后备内存)呢?”,您就对了一半。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33912861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档