如何正确释放与 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** 以避免内存泄漏?