2010-05-13 43 views
4

我遇到問題,理解爲什麼在一種情況下發生下面的代碼泄漏,而在另一種情況下不會發生。 區別是分配給緩衝區時在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); 


} 

回答

7

因爲您正在重新分配用於指向的緩衝區。當你在代碼的最後到達free(buffer);時,緩衝區將指向NULL(因爲這就是你測試的while循環所測試的),因此當你打電話給free時,你不會調用它原來的指針你malloc'd,你沒有任何聲音。

+0

對於任何人看到這個並想知道如何解決它,使用一個temp指針來保存fgets()的返回值。 – MortalMan 2016-01-24 21:55:04

1

成功閱讀後,一切都會好的。但是,當文件結束時,fgets將返回NULL,因此緩衝區將爲NULL,您將無法釋放它。

1

當fgets返回NULL時,將會發生泄漏。在空指針上自由調用是合法的,但是當然由於這一點你已經失去了原來的指針。

2

如果fgets()返回NULLbuffer失去它的原始值,所以你不再可以free它。