gpt4 book ai didi

c - getline 和 strsep 的内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 14:54:52 26 4
gpt4 key购买 nike

同时使用 getlinestrsep 时发生内存泄漏。我知道 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,则不会发生内存泄漏。

提示?

最佳答案

当你将&line传递给strsep时,它会改变line的值。在内循环结束时,line 将为NULL 并且free(line) 将不执行任何操作。这也会导致 getline 分配一个新缓冲区而不是重用当前缓冲区。

您应该将 line 复制到一个新变量,例如char *line2 = line; 并将 &line2 传递给 strsep

关于c - getline 和 strsep 的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28686220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com