内存泄漏与malloc和fgetc

时间:2017-08-29 20:41:33

标签: c pointers dynamic-memory-allocation realloc

我在使用malloc和getchar从用户那里读取类似内容时遇到了一些麻烦。我得到了结果,然而,我使用valgrind得到了内存泄漏。我对此很无能为力,并且问了我的同学和导师,但似乎没有人知道原因。

char *ReadLineFile(FILE *infile){
   int i=0;
   char c;
   char *newStringLine;
   newStringLine = (char *) malloc(sizeof(char));
   while( (c = fgetc(infile)) != '\n' ){
        newStringLine[i++] = c;
        realloc(newStringLine, (sizeof(char) * (i+1)));
   }
   newStringLine[i] = '\0';
   return newStringLine;
}

Valgrind给了我几个错误,包括1的无效写/读和无效的realloc。

1 个答案:

答案 0 :(得分:5)

您对realloc()的使用是错误的。

realloc(),如果成功,则释放传递的指针,返回带有分配内存的新指针。你需要

  • 在临时指针
  • 中捕获realloc()的返回值
  • 检查NULL以确保成功,然后

    • 如果返回的指针不为NULL,即重新分配成功,请使用新指针。
    • 如果返回的指针为NULL,请做出一些决定,然后继续使用旧指针(作为参数传递)。

相关,引用C11,章节§7.22.3.5

  

realloc函数释放ptr 指向的旧对象并返回   指向size指定大小的新对象的指针。 [....]

  

[...]如果新对象的内存不能   已分配,旧对象未被释放,其值不变。

否则,如果realloc()成功,您(很可能)尝试使用已经存在的free-d内存,这当然会导致undefined behavior

呃 - 哦,我提到了,please see this discussion on why not to cast the return value of malloc() and family in C