如何正确释放与getline()函数相关的内存?

21

我刚开始学习编程,有一个初学者的问题,我想写一个函数逐行读取长度未知的文件。由于我不知道每行的长度,因此我使用了getline()函数:

void readDict(FILE *dict_file){
  //Read dic 
  char *line;
  size_t len = 0, read;
  while((read = getline(&line, &len, dict_file))!=-1){
    check(line); 
  }
  free(line);
  return;
}

因为getline()函数有点像malloc()realloc()函数一样用于处理字符串,所以如果我一直使用这个函数读取很多长度未知的行,会发生内存泄漏或者内存不足吗?


根据文档,在调用getline之前需要为line分配内存,使用malloc函数实现。 - bejado
2
@bejado 不是必须的。 - Sourav Ghosh
@SouravGhosh,如果不分配内存,你会怎么做? - bejado
5
如果*lineptr为NULL,则getline()将分配一个缓冲区用于存储该行,用户程序应该释放该缓冲区。 - Sourav Ghosh
@SouravGhosh 不知道,谢谢! - bejado
1个回答

32
首先,你应该将lineptr初始化为NULL。如果没有适当的初始化,lineptr将包含不确定值,这使lineptr指向无效的内存位置,并且在后面的过程中,在尝试分配(realloc())适当数量的内存时会调用未定义行为
然后,根据man页面

[...]在调用getline()之前,*lineptr可以包含指向malloc()分配的大小为*n字节的缓冲区的指针。 如果缓冲区不足以容纳该行,则getline()使用realloc()重新调整大小,必要时更新*lineptr*n

因此,只要传递相同的*lineptr,如果你在最后仅调用一次free(),那么就不会有问题。

那么当我初始化指针时,应该是 {char *line=NULL;} ? - woshidashen
@GhostKidYao 是的。 - Sourav Ghosh
好的,谢谢你的回答! - woshidashen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接