繁体   English   中英

在失败的getline()之后我需要调用free()吗?

[英]Do I need to call free() after a failed getline()?

以下块导致内存泄漏:

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);

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

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

但是你知道如果line指针不为null,它就被分配了,必须被释放。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM