免费()失败

时间:2012-11-08 08:55:16

标签: c memory-management calloc

如果我在这样的循环中分配内存

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失败。

4 个答案:

答案 0 :(得分:3)

您在循环体内使用了错误的变量(ggggy而不是xxyy)。在其他问题中,这会导致(几乎)所有已分配的内存泄露,因为您丢失了calloc()指针。

答案 1 :(得分:1)

有两种可能性:

  1. free()可能会失败意味着您没有释放您使用的内存(您的问题)
  2. 你的程序有一个错误,你没有释放你使用的内存,你正在泄漏内存。
  3. 第一种情况不大可能发生,如果使用得当,我不知道free()失败的任何情况。如果它被传递了正确的指针,那么该内存将被释放,如果它被传递NULL,它将什么都不做。

    第二种情况更有可能发生,但在上面的片段中看起来还不错。如上所述,您可以使用Valgrind(/vælɡrɪnd/)来检查是否出现问题。 Compile with -O0 -ggdb让Valgrind检查分配和解除分配。

答案 2 :(得分:0)

使用您的程序运行Valgrind之类的工具,看看是否泄漏了任何内存。从您发布的代码中,它看起来不像是在泄漏内存。但是使用Valgrind将证实这一点,并且它也可以指出可能存在的其他问题。

答案 3 :(得分:0)

程序可能内存不足,calloc返回null,内存损坏,最终被杀死。

我建议检查calloc的返回值,而不是假设它成功了。

如果程序需要大量内存,请确保有足够的交换空间来处理要求。请记住,系统上可能还有其他应用程序在运行。

另一种选择是分而治之。一种可能性是将其转换为在多台机器上运行的分布式应用程序。在不知道应用程序的其余部分的作用的情况下,这可能是也可能是不可行的。