我需要在Windows上测试项目的性能。
我有一个数组rede_conexoes
的数组,并在循环中分配每个位置,但是经过一些迭代之后,malloc
函数不起作用并突然停止了我的过程,甚至没有测试返回值和不会显示错误消息。
该代码在Windows 10的WSL(Linux的Windows子系统)上可以正常工作。为了在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
时,它开始失败,如果num_PL
大于2^15 = 32768
在Linux上没有问题。我在命令提示符(cmd)和PowerShell上测试了gcc创建的.exe,两者的结果相同。
答案 0 :(得分:3)
当您将最后一个数字(当i == num_PL - 1
和j == num_PL - 1
读入&rede_conexoes[i][j]
时,您已经为bool
(通常为1个字节)分配了空间,但是已要求运行时读取int
(通常为4个字节,有时为8个字节)。这可能会在分配的空间末尾写入几个字节。这会导致“未定义的行为”,从而导致程序似乎无法正常工作,行为异常或崩溃。
取决于num_PL
的值以及您的运行时如何处理内存管理,这些多余的字节可以覆盖运行时用来跟踪内存块的某些控制数据。根据被覆盖的内容及其使用方式,这可能会导致崩溃。
如评论中所述,一种解决方案是将整数读入类型为int
的局部变量,然后将其分配给bool
数组。
答案 1 :(得分:0)
也许,操作系统不允许调用过程为您提供所有内存。
假设您正在使用二次二维(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)
所有这些内存都可用于调用过程?