首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用getline逐行读取文件时的内存泄漏

使用getline逐行读取文件时的内存泄漏
EN

Stack Overflow用户
提问于 2019-04-17 15:26:52
回答 2查看 2.6K关注 0票数 0

我使用getline逐行读取文件。瓦兰德告诉我,我的记忆被泄露了,我不知道我没有释放什么内存。

编辑:作为对注释的回应,我想澄清一下:我不能释放"token“变量,除非得到val差使的错误消息,但是我可以释放"line”变量,这是我现在在循环之后所做的(参见下面的代码)。尽管我在循环的末尾有“空闲(行)”,但我仍然收到一条来自valgrind的内存泄漏消息。在循环中添加一个“空闲(行)”并不能解决这个问题。

我基本上是从文件中读取文本行,然后将该行的相关信息分配给结构。有关守则是:

代码语言:javascript
运行
复制
    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 ;

瓦伦丁告诉我我的记忆泄露了

代码语言:javascript
运行
复制
while ((read = getline(&line, &len, pf_initial_data)) != -1) 

特别是在那一行上面写着

代码语言:javascript
运行
复制
==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#中的该行中选择特定的字符串/字符数组,那么我也很乐意看到这一点。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-17 15:34:10

您必须释放getline返回的内存。来自man(3) getline:

如果*lineptr设置为NULL,并且*n在调用之前设置为0,那么getline()将分配一个缓冲区来存储该行。即使getline()失败,用户程序也应该释放此缓冲区。

票数 4
EN

Stack Overflow用户

发布于 2019-04-17 16:03:12

根据这个链接:http://man7.org/linux/man-pages/man3/getline.3.html (如果给定缓冲区中的新行没有足够的内存),函数getline将使用realloc为新行分配一个新内存。

在您的示例中,您已经将char* line初始化为NULL,这意味着getline函数将找不到新行的空间,并将为其分配一个新内存。所以,你需要在你停止使用它之后释放它。

代码语言:javascript
运行
复制
fclose(pf_initial_data);
free(line);    //simply add this line
return s_ID;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55731141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档