getline 和 strsep 的内存泄漏
Memory leak with getline and strsep
将 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 returns 这个:
==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
,就没有内存泄漏。
提示?
当你将&line
传递给strsep
时,它会改变line
的值。在内循环结束时,line
将变为 NULL
,而 free(line)
将不执行任何操作。这也会导致 getline
分配一个新缓冲区而不是重新使用当前缓冲区。
您应该将 line
复制到一个新变量,例如char *line2 = line;
并将 &line2
传递给 strsep
.
将 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 returns 这个:
==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
,就没有内存泄漏。
提示?
当你将&line
传递给strsep
时,它会改变line
的值。在内循环结束时,line
将变为 NULL
,而 free(line)
将不执行任何操作。这也会导致 getline
分配一个新缓冲区而不是重新使用当前缓冲区。
您应该将 line
复制到一个新变量,例如char *line2 = line;
并将 &line2
传递给 strsep
.