malloc 和 fgetc 导致内存泄漏

瑞克奈特

我在使用 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()是错误的。

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

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

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

相关,引用C11,章节 §7.22.3.5

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

和,

[...] 如果不能为新对象分配内存,则旧对象不会被释放并且其值不变。

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


哦,哦,我有没有提到,请参阅有关为什么不在malloc()C中转换and family的返回值的讨论

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档