【发布时间】:2015-02-24 00:27:25
【问题描述】:
将getline 与strsep 一起使用时出现内存泄漏。我知道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,则没有内存泄漏。
提示?
【问题讨论】:
-
你正在改变
token。那是你最终应该给 free 的指针。但你把它改得面目全非。 -
是的,我删除了
free(token),但与 Valgrind 的结果相同。 -
您更新了问题?这很令人困惑。 (而且不礼貌,恕我直言)
-
请注意,getline 不会将其第二个参数所指向的值更新为读取的行长度,而是使用 malloc 分配或重新分配的缓冲区大小。行长就是返回值。
标签: c memory-leaks