我使用getline逐行读取文件。瓦兰德告诉我,我的记忆被泄露了,我不知道我没有释放什么内存。
编辑:作为对注释的回应,我想澄清一下:我不能释放"token“变量,除非得到val差使的错误消息,但是我可以释放"line”变量,这是我现在在循环之后所做的(参见下面的代码)。尽管我在循环的末尾有“空闲(行)”,但我仍然收到一条来自valgrind的内存泄漏消息。在循环中添加一个“空闲(行)”并不能解决这个问题。
我基本上是从文件中读取文本行,然后将该行的相关信息分配给结构。有关守则是:
struct initial_data_params s_ID = {} ;
char* line = NULL ;
char* token = NULL ;
size_t len = 0 ;
ssize_t read = 0 ;
FILE* pf_initial_data = fopen(fN_initial_data, "r") ;
while ((read = getline(&line, &len, pf_initial_data)) != -1) {
token = strsep(&line, "=") ;
if ((token != NULL) && (strcmp(token, "r2Exp_amp") ==0)) {
token = strsep(&line, "=") ;
if (token != NULL) {
s_ID.r2Exp_amp = strtod(token, NULL) ;
}
}
(do something like this 9 more times for 9 other paramters)
}
fclose(pf_initial_data) ;
free(line) ;
line = NULL ;
return s_ID ;
瓦伦丁告诉我我的记忆泄露了
while ((read = getline(&line, &len, pf_initial_data)) != -1)
特别是在那一行上面写着
==172360== 1,200 bytes in 10 blocks are definitely lost in loss record 57 of 58
==172360== at 0x4C29BC3: malloc (vg_replace_malloc.c:299)
==172360== by 0x5CE0744: getdelim (in /usr/lib64/libc-2.17.so)
==172360== by 0x416321: read_initial_data (file_io.c:38)
==172360== by 0x402FA4: main (main.c:14)
我应该补充一点:如果您认为有更好的方法逐行读取文件并从c#中的该行中选择特定的字符串/字符数组,那么我也很乐意看到这一点。
发布于 2019-04-17 15:34:10
您必须释放getline返回的内存。来自man(3) getline:
如果*lineptr设置为NULL,并且*n在调用之前设置为0,那么getline()将分配一个缓冲区来存储该行。即使getline()失败,用户程序也应该释放此缓冲区。
发布于 2019-04-17 16:03:12
根据这个链接:http://man7.org/linux/man-pages/man3/getline.3.html (如果给定缓冲区中的新行没有足够的内存),函数getline将使用realloc为新行分配一个新内存。
在您的示例中,您已经将char* line初始化为NULL,这意味着getline函数将找不到新行的空间,并将为其分配一个新内存。所以,你需要在你停止使用它之后释放它。
fclose(pf_initial_data);
free(line); //simply add this line
return s_ID;
https://stackoverflow.com/questions/55731141
复制相似问题