fgets分配给缓冲区时出现泄漏问题

4
我有困难理解为什么以下代码在某些情况下会泄漏,而在另一种情况下不会泄漏。 区别在于:
while(NULL!=fgets(buffer,length,file))//doesnt leak
while(NULL!=(buffer=fgets(buffer,length,file))//leaks

我以为会是一样的。

以下是完整代码。

#include <stdio.h>
#include <stdlib.h>

#define LENS 10000

void no_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=fgets(buffer,LENS,fp)){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
void with_leak(const char* argv){
  char *buffer = (char *) malloc(LENS);
  FILE *fp=fopen(argv,"r");

  while(NULL!=(buffer=fgets(buffer,LENS,fp))){
    fprintf(stderr,"%s",buffer);

  }
  fclose(fp);
  fprintf(stderr,"%s\n",buffer);
  free(buffer);  


}
4个回答

7

因为你正在重新分配buffer指向的内容。当你到达代码末尾的free(buffer);时,buffer将会指向NULL(因为这是你用来退出while循环的测试条件),因此当你调用free时,你不是在原始指针上调用它,而是在空指针上调用它。


对于任何看到这个并想知道如何解决的人,请使用一个临时指针来保存fgets()的返回值。 - MortalMan

2
如果 fgets() 返回 NULLbuffer 将失去其原始值,因此您将无法再 free 它。

1

读取成功时,一切都很好。但是当到达文件末尾时,fgets将返回NULL,因此缓冲区将为NULL,您将无法释放它。


1

当fgets返回NULL时,您将获得一个泄漏。在空指针上调用free是合法的,但是当然在这一点上您已经失去了原始指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接