首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带getline和strsep的内存泄漏

带getline和strsep的内存泄漏
EN

Stack Overflow用户
提问于 2015-02-24 00:27:25
回答 1查看 6K关注 0票数 6

在将getlinestrsep一起使用时,会出现内存泄漏。我知道strsep修改了line --这是原因吗?line未被正确释放。

代码语言:javascript
复制
  FILE *file = fopen("keywords.txt", "r");
  if (file) {
    char* line = NULL;
    size_t len = 0;
    ssize_t read;

    while ((read = getline(&line, &len, file)) != -1) {  // Line 35

      char *token;
      while ((token = strsep(&line, "\t")) != NULL) {
        // Do stuff
      }

    }

    free(line);
    fclose(file);
  }

瓦兰公司将返回以下内容:

代码语言:javascript
复制
==6094== 4,680 bytes in 39 blocks are definitely lost in loss record 7 of 7
==6094==    at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==6094==    by 0x51AEBB4: getdelim (iogetdelim.c:66)
==6094==    by 0x4009B3: read_keywords (main.c:35)
==6094==    by 0x400959: renew_init (main.c:64)
==6094==    by 0x400A48: main (main.c:68)

如果我注释掉strsep,就不会有内存泄漏。

小费?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-24 00:33:58

当您将&line传递给strsep时,它将更改line的值。在内部循环的末尾,line将是NULLfree(line)将什么也不做。这也将导致getline分配一个新的缓冲区,而不是重用当前的缓冲区。

您应该将line复制到一个新变量,例如char *line2 = line;,并将&line2传递给strsep

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

https://stackoverflow.com/questions/28686220

复制
相关文章

相似问题

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