![](/img/trans.png)
[英]Is this memory leak from my program or the computer? How can I fix it?
[英]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.