c - getline() 有内存泄漏,用 valgrind 测试
问题描述
这是我的代码的骨架:
int main (int argc, char* argv []) {
int n, offset, offset1;
int error = 0;
char *buf = NULL;
size_t len = 0;
char load_var[] = "load";
while(getline(&buf, &len, stdin) > 0) {
char cmd[65] = "";
while ((n = sscanf(buf,"%64s%n",cmd, &offset)) > 0) {
if (!strcmp(cmd,load_var)) {
char str[65] = "";
char another_str[65] = "";
int var_num;
buf += offset;
if ((var_num = sscanf(buf,"%64s%n%64s%n",str,&offset, another_str, &offset1)) > 0) {
some_function(str);
}
buf += offset;
}
}
}
free(buf);
return error;
}
Valgrind 返回消息:
==15414== 120 bytes in 1 blocks are definitely lost in loss record 1 of 1
==15414== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==15414== by 0x4EA5F54: getdelim (iogetdelim.c:66)
==15414== by 0x401B3B: main (dev.c:177)
我不知道我在哪里使用getline()
错误,因此程序出现内存错误。
解决方案
此评论是正确答案:
buf += offset
这将在您随后的 getline 调用中调用未定义的行为,并最终释放。坦率地说,我很惊讶这不会崩溃。——沃兹克雷格
Valgrind 还应该在报告泄漏之前报告“无效的重新分配”或类似的情况。
推荐阅读
- r - Negative currency values using parse_number in readr R
- sql - SQL - Returning recent payment date and amount
- google-cloud-dlp - Google DLP: 'Resource' object has no attribute 'content'
- redux - Apollo Client 2.0 中限制 2 路服务器同步
- swift - 使用子字符串查找 NSTableView 单元格并滚动到单元格
- php - Add a constraint to a previous query with 3 select
- android - 使用游标从列值获取数据到活动 sqlite
- php - Codeigniter 3 blog bug: post id is replaced with category id
- python - 将键盘快捷键绑定到python中的异常
- python - 加速选择子集