如果我在这样的循环中分配内存
for(file = 0; file < nfile; file++){
...
...
...
for(yy = 0; yy < ngridy; yy++){
for(xx = 0; xx < ngridx; xx++) {
tmparr1[xx+(ngridx*yy)] = (double *)calloc(nptperf[file], sizeof(double));
tmparr2[xx+(ngridx*yy)] = (double *)calloc(nptperf[file], sizeof(double));
}
}
稍后在代码中,我就像这样释放内存:
for(yy = 0; yy < ngridy; yy++){
for(xx = 0; xx < ngridx; xx++) {
free(tmparr1[xx+(ngridx*yy)]);
free(tmparr2[xx+(ngridx*yy)]);
}
}
是否有可能free()
不释放内存,从而导致分配更多内存?
我每file
个循环分配和释放一次内存。此外,nptperf[file]
通常约为1-3百万分,ngridx = ngridy = 100
。
此程序适用于ngridx = ngridy = 80
及更少,但在100
失败。
答案 0 :(得分:3)
您在循环体内使用了错误的变量(gg
和ggy
而不是xx
和yy
)。在其他问题中,这会导致(几乎)所有已分配的内存泄露,因为您丢失了calloc()
指针。
答案 1 :(得分:1)
有两种可能性:
free()
可能会失败意味着您没有释放您使用的内存(您的问题)第一种情况不大可能发生,如果使用得当,我不知道free()
失败的任何情况。如果它被传递了正确的指针,那么该内存将被释放,如果它被传递NULL
,它将什么都不做。
第二种情况更有可能发生,但在上面的片段中看起来还不错。如上所述,您可以使用Valgrind(/vælɡrɪnd/)来检查是否出现问题。 Compile with -O0 -ggdb
让Valgrind检查分配和解除分配。
答案 2 :(得分:0)
使用您的程序运行Valgrind之类的工具,看看是否泄漏了任何内存。从您发布的代码中,它看起来不像是在泄漏内存。但是使用Valgrind将证实这一点,并且它也可以指出可能存在的其他问题。
答案 3 :(得分:0)
程序可能内存不足,calloc返回null,内存损坏,最终被杀死。
我建议检查calloc的返回值,而不是假设它成功了。
如果程序需要大量内存,请确保有足够的交换空间来处理要求。请记住,系统上可能还有其他应用程序在运行。
另一种选择是分而治之。一种可能性是将其转换为在多台机器上运行的分布式应用程序。在不知道应用程序的其余部分的作用的情况下,这可能是也可能是不可行的。