如果我像这样在循环中分配内存
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-300万个点左右,ngridx = ngridy = 100。
此程序适用于ngridx = ngridy = 80和更低版本,但在100上失败。
发布于 2012-11-08 16:59:09
您在循环体中使用了错误的变量(gg和ggy,而不是xx和yy)。在其他问题中,这会导致(几乎)所有分配的内存泄漏,因为您丢失了calloc()ed指针。
发布于 2012-11-08 17:21:03
有两种可能性:
free()可能会失败,这意味着你没有释放你使用的内存(你的问题)第一种情况不太可能发生,我不知道如果使用得当,free()会在什么情况下失败。如果传递给它正确的指针,该内存将被释放,如果传递给NULL,则不会执行任何操作。
第二种情况更有可能发生,但在上面的代码片段中看起来没问题。如上所述,您可以使用Valgrind (/ˈválɡrɪnd/)来检查是否出现了错误。Compile with -O0 -ggdb并让Valgrind检查分配和释放。
发布于 2012-11-08 16:58:23
在你的程序中运行一个像这样的工具,看看是否有内存泄漏。从您发布的代码来看,看起来不像是内存泄漏。但使用Valgrind将证实这一点,并可以指出可能存在的其他问题。
https://stackoverflow.com/questions/13285571
复制相似问题