繁体   English   中英

一些调用后,Malloc无法正常工作(C,在Windows 10上使用gcc编译为MinGW-W64)

[英]Malloc not working after some calls (C, compiled with gcc for MinGW-W64 on Windows 10)

我需要在Windows上测试我的项目的性能。
我有一个数组的数组rede_conexoes ,并在循环中分配每个位置,但在一些迭代后, malloc函数不起作用并突然停止我的进程,然后我甚至可以测试返回值并显示没有错误消息。

代码在Windows 10上的WSL(Windows子系统Linux)上运行得非常好。为了在Windows上本地测试代码,我为gcc编译器安装了Mingw-w64(找不到更好的解决方案,因为需要支持OpenMP )。
这是带有malloc函数的代码片段:

bool **rede_conexoes = (bool**) malloc(num_PL * sizeof(bool*));
...
for(int i = 0; i < num_PL; i++){
    rede_conexoes[i] = (bool*)malloc(num_PL*sizeof(bool)); // <- Error occurs here
    if(rede_conexoes[i] == NULL) exit(1); // <- Can't get to this line after the error
    for(int j = 0; j < num_PL; j++)
        fscanf(model, "%d", (int*)&rede_conexoes[i][j]);
}

我不明白如何在没有WSL问题的情况下运行,但在Windows上它崩溃并且没有错误消息。
我注意到当num_PL大于2^3 = 8时它开始失败,如果在Linux上num_PL大于2^15 = 32768则没有问题。 我在命令提示符(cmd)和PowerShell上测试了由gcc创建的.exe,两者都具有相同的结果。

当您将最后一个数字(当i == num_PL - 1j == num_PL - 1 )读入&rede_conexoes[i][j] ,您已为bool分配空间(通常为1个字节),但您已经问过读取int的运行时(通常为4或有时8个字节)。 这可能会在您分配的空间末尾写入几个字节。 这会导致未定义的行为,导致程序出现工作,行为不当或崩溃。

根据num_PL的值以及运行时处理内存管理的方式,这些额外的几个字节可以覆盖运行时用于跟踪内存块的一些控制数据。 根据被覆盖的内容及其使用方式,这可能会导致您遇到的崩溃。

注释中提到的一个解决方案是将整数读入int类型的局部变量,然后将其分配给bool数组。

也许,操作系统不允许调用进程给你所有的内存。

假设您正在使用二次二维(2D)数组:

2^15 * 2^15 = 32.768 * 32.768 = 1.073.741.824 booleans!

如果您在32位架构sizeof(bool*) = 4中运行此代码:

1.073.741.824 * 4 = 4.294.967.296 (4GB)

如果您在64位架构sizeof(bool*) = 8中运行此代码:

1.073.741.824 * 8 = 8.589.934.592 (8GB)

调用进程可以使用所有内存吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM