c - getline() 有内存泄漏,用 valgrind 测试

标签 c memory-management memory-leaks 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

that will invoke undefined behavior on your subsequent getline invokes, and your final free. Frankly, I'm amazed this doesn't crash. – WhozCraig

在报告泄漏之前,Valgrind 还应该报告“无效的 realloc”或类似的信息。

关于c - getline() 有内存泄漏,用 valgrind 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51414363/

相关文章:

c - 我如何将其转换为在 C 程序中工作?

字符指针

ios - 静态函数与普通类函数

c++ - 可以从进程核心访问释放的内存段吗?

linux pmap 了解在特定虚拟地址空间中运行的内容

ios - 奇怪和陌生的内存行为

c - 如何仅使用指针和指针算术删除 c 中所有出现的字母。

c - (C) Pointer Declared in function,函数结束后指针丢失了吗?

java - 内存泄漏运行 Apache Thrift 服务器

c++在请求特定字节的新之后删除