簡體   English   中英

如何解決內存泄漏?

[英]How do I fix my memory leak?

我有

int main(void){
  while (1){
    char *input = NULL;
    char buf[1000];
    int read;
    size_t len;
    read = getline(&input, &len, stdin);

    if (-1 != read){
      sprintf(buf, "%s", input);
      lowercase(buf);; // custom function
      get_command(buf); // custom function already checked for memory leak
    }
    free(stdin);
    free(input);
    free(buf);
  }
  return 0;
}

通過valgrind運行此命令將返回:

HEAP SUMMARY
by 0x4022c2: main(prog.c:647) //  read = getline(&input, &len, stdin);

LEAK SUMMARY
still reachable: 120 bytes in 1 blocks

既然我釋放了所有內容(stdin,input,buf),為什么它仍然給我內存泄漏? 以及我該如何解決?

在注釋中,您說您從函數get_command調用exit(0) 調用exit(x)行為就像程序從main返回x 這意味着您可以跳過main末尾的清理代碼。

為了解決此問題,您可以從get_command返回一個值,例如對於常規操作為0,對於錯誤為-1或對於輸入結束為1。 這意味着get_command中的exit(0)現在變為return 1

您的main循環如下所示:

int main(void)
{
    char *input = NULL;
    size_t len = 0;

    while (1) {
        if (getline(&input, &len, stdin) < 0) break;

        lowercase(input);
        if (get_command(input) == 1) break;
    }

    free(input);

    return 0;
}

請注意,我已修復了您的代碼的其他一些問題:

  • 不要使用固定大小的臨時緩沖區。 getline可以讀取任意長度的行。 如果將它們復制到臨時緩沖區,至少要確保它適合。 畢竟,您已經獲得了len信息。 最好直接使用input字符串。
  • 每次調用getline時,請勿以NULL緩沖區開頭。 這將減少分配的數量,因為僅當一行的行長於之前讀取的每一行時,才會分配新的內存,這種情況不會經常發生。 這也意味着free應該在循環之后進行。

暫無
暫無

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

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