【发布时间】:2015-05-03 12:00:46
【问题描述】:
我有
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),为什么它仍然给我内存泄漏?我该如何解决这个问题?
【问题讨论】:
-
删除
free(stdin);和free(buf); -
所有这些
free()s,而不是malloc()!你真的需要回到书本上——这段代码有很多问题! -
并为
input分配内存。 -
我是你展示的代码,你不会跳出循环。你是来自
get_command的某个地方的exit()吗?在这种情况下,您将绕过free(input)。 -
getline的优点是它会读取任意长度的行并为其分配足够的内存。使用临时固定大小的缓冲区buf会失去这种优势。如果你有很长的行,buf可能会溢出。 (当然,1000 个字符已经足够了,为什么还要冒这个险?只需小写input并将其传递给get_command。)
标签: c memory-management memory-leaks