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

4 回答 4

7

因为您正在重新分配曾经指向的缓冲区。当您到达free(buffer);代码末尾时,缓冲区将指向NULL(因为这是您为退出 while 循环而测试的内容),因此当您调用 free 时,您不会在原始指针上调用它你malloc会的,你什么都没有。

于 2010-05-13T08:19:59.807 回答
2

如果fgets()返回NULLbuffer则失去其原始价值,因此您不再可以free

于 2010-05-13T08:21:52.423 回答
1

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

于 2010-05-13T08:20:02.037 回答
1

当 fgets 返回 NULL 时,您将得到泄漏。在 NULL 指针上调用 free 是合法的,但当然此时您已经丢失了原始指针。

于 2010-05-13T08:20:19.537 回答