微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

GNU MP:无法分配内存大小=4294959136

如何解决GNU MP:无法分配内存大小=4294959136

尽管以 64 位编译,GMP 似乎无法分配大于此数量的内存。我有一个简单的程序,您可以对其进行测试,并且在运行它时似乎只使用了 1500 mb 的内存,仅此而已。这应该能够计算偶数 32 位应用程序的数字,但是由于它是 64 位,因此无法计算数字似乎很奇怪。这是一个遇到此问题的简单程序

#include "gmp.h"

int main()
{
    unsigned int n = 500000000;
    mpz_t output;

    mpz_init(output);
    mpz_fac_ui(output,n);
    mpz_clear(output);

    return 0;
}

GMP 6.2.1 从 MSYS2、Windows 10 64bit、20h2、GCC 安装

解决方法

这种情况是在 Windows 上使用主要面向 UNIX 的库的典型情况:YMMV。

果然,快速检查发现 long 数据类型 (example) 的广泛使用。毫不奇怪,它在 Win32 上不起作用,其中 long 是 32 位。 Win32 使用 LLP64 模型,MinGW 遵循该模型 (source)。

即使是打印 GNU MP: Cannot allocate memoryerror reporting code 也是有问题的:

   fprintf (stderr,"GNU MP: Cannot allocate memory (size=%lu)\n",(long) size);

它实际上是将 64 位 size_t 打印为 32 位 long。所以您看不到实际的 size 值。

如果我们解决这个问题:

   fprintf (stderr,"GNU MP: Cannot allocate memory (size=%zu)\n",size);

现在打印出它试图 size 的真实 malloc

GNU MP: Cannot allocate memory (size=18446744073709250080)

所以它在某处溢出和/或环绕(可能是另一个 long 变量)。 Reportlibgmp 项目。如需更多曝光也可向MSYS2举报。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。