同时使用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注释掉,则不会发生内存泄漏。

尖端?

最佳答案

当您将&line传递给strsep时,它将更改line的值。在内循环结束时,line将为NULL,而free(line)将不执行任何操作。这也将导致getline分配一个新缓冲区,而不是重用当前缓冲区。

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

关于c - 使用getline和strsep发生内存泄漏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28686220/

10-08 20:31