内存泄漏与malloc和fgetc

ric*_*ght 1 c pointers realloc dynamic-memory-allocation

我在使用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;
}
Run Code Online (Sandbox Code Playgroud)

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

Sou*_*osh 5

你的用法realloc()是错误的.

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

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

    • 如果返回的指针不为NULL,即重新分配成功,则使用新指针.
    • 如果返回的指针为NULL,则做出一些决定,并且可以继续使用旧指针(作为参数传递).

相关的,引用C11,章节§7.22.3.5

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

和,

[...]如果无法分配新对象的内存,则不会释放旧对象,并且其值不会更改.

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


哦,哦,我提到了,请看这个讨论为什么不在C中投出malloc()和家人的回报值