c++ - 奇怪的 malloc 行为不允许在 64 位进程上分配超过 2GB 的内存

标签 c++ linux windows unix memory-management

这个问题涉及我正在开发的一个程序。

我从事的项目要求不通过网络发送行集或大于 2GB 的行(网络不能发送大于 2GB 的数据组)。我已经对代码进行了所有适当的更改,因此它不会发送这个/这些组,但现在我正在尝试构建测试用例。

我已经构建了一个测试,它创建了不到 10 亿行,这些行占用了超过 2 GB 的空间。在通过网络发送这些行之前,程序会正确地过滤掉它们。

我遇到的问题是我需要创建一个单独的行来保存一个包含单个字符串的列或列的集合,在该行内,保存字符串,其中该行的大小大于2GB。但是当字符串开始占用接近 2GB 时,malloc 返回 NULL

我做了一些研究,发现可能是我没有足够的连续内存,所以我开始添加更多带有较小字符串的列。我已经将 2GB 字符串分解为 64 列,这样它就不必一次分配那么多了。不过,我仍然遇到同样的问题,而且我怀疑自己忽略了一些东西。

它是 64 位 Windows 7 系统上的 64 位进程。 8GB 内存。 (但我也在 64 位 red hat 机器上测试过,有 24GB 内存)

有没有人知道为什么系统在接近 2GB 时不分配程序内存?

附言我还研究了每个进程在 64 位系统上可以分配的内存,它超过了 100TB。考虑到它太多了,当我接近 2GB 时我无法分配这一事实真的让我感到困惑。

最佳答案

在对我遇到这个问题的大量代码进行了大量探索之后,我注意到传递给 calloc(uint_64) 的大小是由一个返回带符号的函数计算的整数。由于此数字溢出,当编译器将其转换为 uint_64 时,设置了最大位。这当然会导致 calloc 尝试分配大量内存。

当然有几个可能的解决方案:

  1. 将 size 函数的返回类型更改为 uint_32(这对于我的代码库和时间限制而言变化太大)
  2. 将 size 函数的结果转换为 uint_32,然后将其传递给 calloc(我选择的选项,暂时绕过大分配)

我希望这最终能帮助到其他人,

关于c++ - 奇怪的 malloc 行为不允许在 64 位进程上分配超过 2GB 的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068145/

相关文章:

windows - 升级到 Windows 10,现在 WAMP 无法工作

c++ - GCC/g++ cout << 与 printf()

c++ - 为什么 std::vector<uint8_t>::insert 使用 MSVC 2015 编译器时比 std::copy 快 5 倍?

c# - shell 扩展如何将多个选定的文件传递给我自己的程序?

linux - 如何在 UNIX 中使用 if 语句

xml - 如何从所有 .xml 文件中删除所有包含字符串的行?

c++ - 如何获取clang抽象语法树右侧的整个表达式?

linux - 无法通过 SSH 连接到远程服务器。错误: ssh_exchange_identification: read: Connection reset by peer

windows - 目录中有多少个文件太多(在 Windows 和 Linux 上)?

windows - 带有 SourceTree 的 git 和 Cygwin 路径