Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的马洛克行为赢得了';不允许在64位进程上分配超过2GB的内存_C++_Linux_Windows_Unix_Memory Management - Fatal编程技术网

C++ 奇怪的马洛克行为赢得了';不允许在64位进程上分配超过2GB的内存

C++ 奇怪的马洛克行为赢得了';不允许在64位进程上分配超过2GB的内存,c++,linux,windows,unix,memory-management,C++,Linux,Windows,Unix,Memory Management,这个问题涉及到我为之开发的一个程序 我正在从事一个项目,该项目要求不通过网络发送行集或大于2GB的行(网络不能以大于2GB的组发送数据)。我已经对代码做了所有适当的更改,所以它不会发送这个/这些组,但现在我正在尝试构建测试用例 我已经构建了一个测试,它创建的行数不到10亿,占用的空间超过2GB。在通过网络发送这些行之前,程序会正确地过滤掉这些行组 我遇到的问题是,我需要创建一行来保存一个包含单个字符串的列,或在该行中保存字符串的列集合,其中此行的大小大于2GB。但是当字符串开始占据接近2GB的空

这个问题涉及到我为之开发的一个程序

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

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

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

我做了一些研究,发现这可能是因为我没有足够的连续内存,所以我开始用更小的字符串添加更多的列。我甚至将
2GB
字符串分成64列,这样就不必一次分配那么多。尽管如此,我还是遇到了同样的问题,我开始怀疑自己忽略了什么

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

有人知道为什么当程序内存接近2GB时,系统不会分配程序内存吗


另外,我还查看了64位系统上每个进程可以分配的内存,内存超过了
100TB
。考虑到这是如此之多,当我接近2GB时无法分配的事实真的让我困惑

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

当然,有两种可能的解决方案:

  • 将size函数的返回类型更改为
    uint_32
    (这对于我的代码库和时间限制来说更改太大)
  • 将size函数的结果强制转换为
    uint_32
    ,然后再将其传递给calloc(我选择的选项是暂时绕过较大的分配)
  • 我希望这最终能帮助其他人


    Dan

    您是否使用足够大的整数类型来存储大小?我假设您运行的是64位操作系统,而不仅仅是64位硬件?@TopGunCoder:
    gcAllowVeryLargeObjects
    适用于.NET framework。这是一个C++应用程序,对吧?我有相同的配置,10GB运行良好(虽然分配需要一段时间)。那个仍然表现出这种行为的最小、可编译的程序怎么样?花点时间写下来。如果程序没有显示错误,那么问题就出在代码的其他地方。如果是这样,就更容易找出问题所在。@TopGunCoder:不,不要重新创建实现!只需编写一个非常小的程序,尝试以与实际程序类似的方式分配内存。如果这样做有效,您的问题可能是内存分配以外的其他地方,您可以停止查看配置等。我发现了问题所在!就在我准备继续之前,我注意到有人将变量类型从32 unsigned更改为signed。因此,当这被我的大行溢出并传递到我拥有的alloc包装器中时,负位将转移到无符号64的负位。。。正在创建它试图分配的大量内存!!!谢谢大家的帮助!!如果你们没有提出如此彻底的建议,我不会注意到这种微妙之处:D:D:D:为什么不返回
    size\u t