首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >free()失败

free()失败
EN

Stack Overflow用户
提问于 2012-11-08 16:55:16
回答 4查看 115关注 0票数 2

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

代码语言:javascript
复制
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));
      }
   }

稍后在代码中,我会像这样释放内存:

代码语言:javascript
复制
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上失败。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-08 16:59:09

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

票数 3
EN

Stack Overflow用户

发布于 2012-11-08 17:21:03

有两种可能性:

  1. free()可能会失败,这意味着你没有释放你使用的内存(你的问题)
  2. 你的程序有一个错误,你没有释放你使用的内存,你正在泄漏内存。

第一种情况不太可能发生,我不知道如果使用得当,free()会在什么情况下失败。如果传递给它正确的指针,该内存将被释放,如果传递给NULL,则不会执行任何操作。

第二种情况更有可能发生,但在上面的代码片段中看起来没问题。如上所述,您可以使用Valgrind (/ˈválɡrɪnd/)来检查是否出现了错误。Compile with -O0 -ggdb并让Valgrind检查分配和释放。

票数 1
EN

Stack Overflow用户

发布于 2012-11-08 16:58:23

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13285571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档