2009-01-29 73 views
2

我在編寫C代碼時經常使用網站www.cplusplus.com作爲參考。fread C++參考示例

我正在閱讀fread的頁面上引用的例子,並有一個問題。

舉個例子,他們張貼:

/* fread example: read a complete file */ 
#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    FILE * pFile; 
    long lSize; 
    char * buffer; 
    size_t result; 

    pFile = fopen ("myfile.bin" , "rb"); 
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (char*) malloc (sizeof(char)*lSize); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

    // copy the file into the buffer: 
    result = fread (buffer,1,lSize,pFile); 
    if (result != lSize) {fputs ("Reading error",stderr); exit (3);} 

    /* the whole file is now loaded in the memory buffer. */ 

    // terminate 
    fclose (pFile); 
    free (buffer); 
    return 0; 
} 

這在我看來,如果結果= lSize所,然後免費(緩衝區)將永遠不會被調用!在這個例子中,這會是內存泄漏嗎?

我一直認爲他們網站上的例子質量很高。也許我不是很正確的理解?

回答

4

在這個例子中,它不會是內存泄漏,因爲終止程序(通過調用exit())釋放所有與其關聯的內存。

但是,如果您將這段代碼作爲子程序使用,並將其稱爲return 1;而不是exit(),則會導致內存泄漏。

0

當進程關閉時,操作系統會清除進程中任何未公佈的內存。至少,現代的操作系統。

0

如果程序沒有退出點結果!= lSize,也就是說,它繼續執行一些其他的路徑,那麼是的 - 這是一個有保證的內存泄漏。

4

從技術上講,是的,這是一個內存泄漏。但是當進程終止時,由進程分配的任何內存都會自動釋放,因此在本例中,釋放(和fclose)調用並不是真正需要的。

在一個更復雜的程序中,這可能是一個真正的問題。缺少的空閒會造成內存泄漏,而丟失的fclose會導致資源泄漏。

0

有兩種可能的路徑。

(1)result!= lSize - 在這種情況下,調用exit(0)。這會殺死進程,操作系統將清理內存。

(2)結果== lsize - 在這種情況下,緩衝區被明確釋放,但之後返回被調用,所以空閒大部分只是很好的樣式,因爲這也會殺死進程,操作系統會再一次,清理內存。

所以在這種簡單的情況下,沒有內存泄漏。但是,確保您釋放您編寫的任何應用程序中分配的任何內存可能是一種很好的做法。進入這種習慣將在未來避免讓你頭痛。

0

對於可能的內存泄漏,其他人已經回答了這個問題。前一段時間,我貼給定的代碼的變化,這應該正確處理所有可能的錯誤情況: