分配给缓冲区时fgets泄漏

时间:2010-05-13 08:13:10

标签: c memory-leaks fgets

我在理解为什么在一种情况下代码泄漏,而在另一种情况下却没有问题。 差异是

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 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

如果fgets()返回NULL,则buffer会丢失原始值,因此您无法再free

答案 2 :(得分:1)

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

答案 3 :(得分:1)

当fgets返回NULL时,您将收到泄漏。

当你失去了原始指针时,在NULL指针上调用free是合法的