簡體   English   中英

getline和strsep導致內存泄漏

[英]Memory leak with getline and strsep

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 ,那就沒有內存泄漏。

提示?

當你傳遞&linestrsep ,它會改變line的值。 在內部循環結束時, lineNULL並且free(line)將不執行任何操作。 這也將導致getline分配新緩沖區而不是重用當前緩沖區。

您應該將line復制到一個新變量,例如char *line2 = line; 並將&line2傳遞給strsep

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM