【问题标题】:Why does a malloc of 2GB or larger of memory in the Heap in C fail?为什么 C 中堆中 2GB 或更大内存的 malloc 会失败?
【发布时间】:2018-01-24 20:03:36
【问题描述】:

我想在 C 堆上分配特定大小的内存。作为测试,我使用了以下代码(检查最大允许值):

int main(void) {
   int *val;
   val=(int*)malloc(4096);
   if(!val)
      break;
   return 0;
}

问题是,当使用malloc() 尝试一系列值时,大小约为 1900MB,它会失败。然而,我安装了 16 GB 的 RAM,其中大约 12 GB 可用。

所以我什至无法考虑分配更高价值的内存。
我做错了什么吗?
关于malloc(),有什么我应该知道的吗?

我看到许多程序(如虚拟机)使用大量内存,所以我已经排除了操作系统的安全功能的想法。

【问题讨论】:

  • 为什么要分配这么多内存呢?另外您使用的是 64 位编译器还是 32 位编译器?
  • if(!val) break; 谁教你的??你甚至没有循环!
  • 好吧 malloc() 会给你你要求的内存量(直到你得到内核恐慌或操作系统拒绝你的请求)。你的问题没有多大意义。
  • 你能显示实际失败的代码吗?
  • @Adosi 我试过 32-但是一个,顺便说一句只是一个测试......

标签: c memory memory-management malloc


【解决方案1】:

分配给您的进程的页面并不构成整个 RAM。你怎么看?不允许整个用户程序访问全部 RAM。操作系统决定了您的进程将分配多少虚拟内存,然后程序启动。这就是为什么您没有显示使用机器的完整 RAM。

长话短说 - 您的程序没有提供整个 RAM 供使用。如果确实如此 - 那么它会引发一个比你现在想象的更大的问题。您对malloc 使用的想法也不清楚。当它是由malloc 返回的NULL 时,它主要要求一个错误条件。您的代码以某种方式抽象了那些接受并引入了一个多余的虚拟 if 块,它什么都不做。

作为用户程序,您将请求内存 - 如果失败,它将返回 NULL 并相应地处理条件。

【讨论】:

  • @zDoes.: 我不确定你能操纵多少。但这几乎不是必需的。
【解决方案2】:

malloc() 是标准库中的 C 和 C++ 运行时函数。内存寻址能力取决于正在使用的编译器以及该编译器的构建设置。

我使用带有 C++ 的 Microsoft Visual 2013 对 Windows 7 x64 进行了以下测试,当我使用 32 位构建目标设置 (x86) 时,然后当我尝试使用 malloc() 分配 4GB 内存块时, malloc() 返回一个 NULL 指针,表示分配失败。

这是意料之中的,因为对于 Windows 32 位操作系统,可以寻址的最大 RAM 量是 32 位指针,但实际上小于 4GB,我认为由于 Windows 32 的管理方式,可用 RAM 大约为 3.5 GB物理内存。

使用另外两种大小进行测试,2GB(失败并返回 NULL 指针)和 1GB(成功并返回有效指针)表明 32 位 C++ 运行时允许的最大值介于 1GB 和 2GB 之间。

然后我将构建设置从 x86 更改为 x64,以生成带有 64 位指针的 64 位可执行文件。

随着构建设置的更改,对malloc() 的 4GB 调用成功并返回了有效指针。

任务管理器显示以下内容:

另请参阅StackOverFlow How can I allocate all the availble memory in visual studio for my application? ,其中包含提及以下内容的公认答案:

获得更大的虚拟内存地址空间需要相当 根本大修。尽管今天很容易,但只需将 x64 定位为 平台目标。 64位进程有大量地址 可用空间,仅受页面文件的最大大小限制。 只要您可以依靠,您就可以在 32 位模式下跛行 实际运行在 64 位操作系统上,通过使用 /LARGEADDRESSAWARE 链接器选项。这将 VM 大小从 2 增加 在 64 位操作系统上为 GB 到 4 GB。

【讨论】:

    猜你喜欢
    • 2017-05-26
    • 2011-02-28
    • 2016-10-07
    • 2011-06-25
    • 2014-12-01
    • 1970-01-01
    • 2014-05-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多