7

以下块导致内存泄漏:

FILE *fp = fopen(path, "r");
char *line = NULL;
size_t len = 0;
ssize_t read = -1;

while ((read = getline(&line, &len, fp)) != -1) {
        /*Do something*/
}

1个块中的120个字节肯定会丢失......

...getline (getline.c:34)

我可以通过添加一个来解决这个问题free()

while ((read = getline(&line, &len, fp)) != -1) {
        /*Do something*/
}
free(line);

我的问题是:为什么在失败时getline分配内存?line为什么我不需要free(line)每次来电getline

4

2 回答 2

9

设置是这样的,您可以将先前分配的内存块传递给,如果需要,getline()它将分配更多 ( )。realloc()(或者你可以从不分配内存开始,就像这里一样。)它可以报告失败或 EOF,但不会释放分配的空间——因此你需要释放它。如果该文件是一个空文件,并且您从没有数据开始,您可能不会分配任何空间;另一方面,它可能在尝试从文件中获取数据之前分配了一些空间。

但是您知道,如果line指针不为空,则它已被分配并且必须被释放。

于 2013-04-25T00:30:50.903 回答
2

getline 可能会以几种不同的方式失败,并且在失败时可能会或可能不会重新分配内存一次或多次。为了保持一致,它永远不会释放内存——请参阅http://www.opensource.apple.com/source/cvs/cvs-19/cvs/lib/getline.c上的一种可能实现

这种一致性使得实现和调用者都更容易......您只需始终释放该行,而不必检查错误代码以查看是否释放它。

于 2013-04-25T00:53:32.693 回答