【问题标题】:Memory leak with getline and strsepgetline 和 strsep 的内存泄漏
【发布时间】:2015-02-24 00:27:25
【问题描述】:

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

  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);
  }

Valgrind 返回:

==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,则没有内存泄漏。

提示?

【问题讨论】:

  • 你正在改变token。那是你最终应该给 free 的指针。但你把它改得面目全非。
  • 是的,我删除了free(token),但与 Valgrind 的结果相同。
  • 您更新了问题?这很令人困惑。 (而且不礼貌,恕我直言)
  • 请注意,getline 不会将其第二个参数所指向的值更新为读取的行长度,而是使用 malloc 分配或重新分配的缓冲区大小。行长就是返回值。

标签: c memory-leaks


【解决方案1】:

当你将&line 传递给strsep 时,它会改变line 的值。在内循环结束时,line 将变为NULL,而free(line) 将什么也不做。这也会导致getline 分配一个新的缓冲区而不是重用当前的缓冲区。

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

【讨论】:

    猜你喜欢
    • 2014-04-09
    • 2023-03-25
    • 2021-01-31
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 2010-12-02
    • 2013-11-08
    • 2016-05-03
    相关资源
    最近更新 更多