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

Posted

技术标签:

【中文标题】如何正确释放与 getline() 函数相关的内存?【英文标题】:How do I properly free memory related to getline() function? 【发布时间】:2017-07-17 15:50:35 【问题描述】:

我刚开始编程并且有一个初学者问题,我想编写一个函数来逐行读取长度未知的文件。由于我不知道每行的长度,所以我使用了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() 一个字符串,所以如果我继续使用这个函数来读取很多长度未知的行,我会出现内存泄漏或内存不足吗?

【问题讨论】:

基于documentation,需要malloc内存为line之前调用getline @bejado 不,这不是必须的。 @SouravGhosh 如果不分配内存你会怎么做? @bejado "如果 *lineptr 为 NULL,则 getline() 将分配一个缓冲区用于存储行,该缓冲区应由用户程序释放。" @SouravGhosh 不知道,谢谢! 【参考方案1】:

首先,您应该将lineptr 初始化为NULL。如果没有正确的初始化,lineptr 将包含不确定的值,这使得lineptr 指向无效的内存位置,稍后在处理过程中,它将调用undefined behavior,同时尝试分配(realloc())适当的内存量。

那么,按照man page,

[...] 在调用getline() 之前,*lineptr 可以包含指向malloc() 分配的缓冲区*n 字节大小的指针。如果缓冲区不够大,无法容纳该行,getline() 会使用realloc() 调整其大小,并根据需要更新*lineptr*n

所以,只要你通过相同的*lineptr,如果你最后只free()一次,你应该没问题。

【讨论】:

所以当我初始化指针时它应该是 char *line=NULL; ? @GhostKidYao 是的。 好的,谢谢您的回答!

以上是关于如何正确释放与 getline() 函数相关的内存?的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind报告从stdin的getline后释放的指针上的内存泄漏

如何正确释放 ID3D11ShaderResourceView** 以避免内存泄漏?

释放返回变量内存的正确方法

移除对象时内存未释放 - 不清楚在 ARC 中释放的正确方法

linux共享内存的控制释放

C++如何正确释放内存?