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

时间:2017-02-27 06:06:44

标签: c pointers dynamic-memory-allocation getline

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

1 个答案:

答案 0 :(得分:16)

首先,您应该将lineptr初始化为NULL。如果没有正确的初始化,lineptr将包含不确定的值,这会使lineptr指向无效的内存位置,稍后在进程中,它会在尝试分配时调用undefined behaviorrealloc() })适量的记忆。

然后,根据man page

  

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

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