我在理解为什么在一种情况下代码泄漏,而在另一种情况下却没有问题。 差异是
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);
}
答案 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是合法的