我有一个关于函数的问题getline(),正如valgrind. 我发布了两个案例的代码并解释了行为。我希望有人能指出我正确的方向。
getline()在 while 循环中调用,读取缓冲区中文本文件的所有行。然后在循环结束时仅释放缓冲区一次:在这种情况下valgrind不会出现错误(不会发生泄漏)。
int main(int argc, char* argv[])
{
char* buffer = NULL;
size_t bufsize = 0;
ssize_t nbytes;
int counter = 0;
char error = 0;
FILE* input_fd = fopen(argv[1], "r");
while ((nbytes = getline(&buffer, &bufsize, input_fd)) != -1)
{
counter += 1;
}
free(buffer);
fclose(input_fd);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
同一个循环调用一个函数,该函数又调用getline(),传递相同的缓冲区。同样,缓冲区仅在循环结束时被释放一次,但在这种情况下会valgrind报告内存泄漏。事实上,让程序运行并查看 RSS,我可以看到它随着循环的进行而增加。请注意,在循环内添加一个 free(每个循环释放缓冲区)问题就会消失。这是代码。
int my_getline(FILE* lf_fd, char** lf_buffer)
{
ssize_t lf_nbytes = 0;
size_t lf_bufsiz …Run Code Online (Sandbox Code Playgroud)