2017-05-16 186 views
0

程序正在泄漏內存並且無法修復它...本程序正在從文本文件中讀取數據,並在讀取數據後,會在數據泄漏內存期間對數據執行特定操作。設備的內存非常有限&閃存驅動器由於這個我不能運行內存泄漏檢查工具。 請告知修正下列C內存泄漏問題

int LanguageRequiredData(void) 
{ 

    char *data=NULL; 
    int retValue = 0 ; 

    retValue = GetString_English(&data); 
    if(retValue>0 && strlen(data)>0) 
    { 
     // Do Some Operation 
    } 

    if (data!=NULL) 
    { 
     Mem_free(data); 
     data = NULL; 
    } 
} 


int GetString_English(char **data) 
{ 

    int retValue = 0 ; 

    retValue = File_LoadContent(LANGSENGFILE,&(*data)); 

    return retValue; 
} 


int File_LoadContent (char *file, char **content) 
{ 

    long size = File_Size(file); 
    char buf[256]={}; 

    memset(buf,0x00,sizeof(buf)); 
    if (*content) 
    { 
    Mem_free(*content); 
    } 
    *content = (char*) Mem_alloc((size+1) * sizeof(char)); 

    TFILE * fd; fd=File_Open(file,"r"); if (fd==NULL) return 0; 
    while (File_Gets(buf,sizeof(buf),fd)!=NULL) 
    { 
    strcat(*content,buf); 
    memset(buf,0x00,sizeof(buf)); 
    } 
    File_Close(fd); return 1; 
} 


void * Mem_alloc(size_t size) 
{ 
    int i; 
    void * ptr = NULL; 

    for (i = 0; i < 2; i++) 
    { 
     ptr = malloc(size); 

     if (ptr) 
     { 
     break; 
     } 
    } 

    if (ptr) 
    { 
     memset(ptr, 0, size); 
    } 

    return ptr; 
} 

void Mem_free(void * ptr) 
{  
    if (ptr != NULL) 
    { 
    free(ptr); 
    } 

    ptr = NULL;  
} 
+1

你到底什麼時候嘗試? –

+0

歡迎來到堆棧溢出!請說明迄今爲止的研究/調試工作。請先閱讀[問]頁面。 –

+4

您介意創建一個[___MCVE___](http://stackoverflow.com/help/mcve)? –

回答

0

這部分的內存泄漏問題 請找到的代碼片段似乎是犯罪嫌疑人:

while (File_Gets(buf,sizeof(buf),fd)!=NULL) 
    { 
    strcat(*content,buf); 
    memset(buf,0x00,sizeof(buf)); 
    } 

具體的strcat()。是File_Gets() null-terminating它寫到buf[]?如果不是那麼strcat()可能會讀取/複製超出buf[]的範圍,因爲它需要零終止來知道何時停止。

編輯:我應該指出,這是推薦strncat()而不是strcat()的原因之一。使用字符串函數的「n」個變體(即strncat(),strncpy(),strncmp())有助於防止緩衝區溢出,並且通常是一種很好的做法。