2017-05-16 14 views
0

Programm ist undicht Speicher und nicht in der Lage, es zu reparieren ... Dieses Programm liest Daten aus Textdateien und nach dem Lesen von Daten, führen Sie bestimmte Operation auf Daten während dieser Speicher leckt. Gerät hat sehr begrenzten Speicher & Flash-Laufwerk aufgrund dieser kann ich keine Speicherlecks Prüfwerkzeuge ausführen. Bitte geben Sie untenC Speicherleck Problem

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

und was hast du bis zur zeit versucht? –

+0

Willkommen bei Stack Overflow! Bitte zeigen Sie Ihre Recherche/Debugging-Aufwand bis jetzt. Bitte lesen Sie zuerst die [Ask] -Seite. –

+4

Sie kümmern sich um die Erstellung eines [___MCVE___] (http://stackoverflow.com/help/mcve)? –

Antwort

0

Dieser Teil der Speicherleck Ausgabe finden Sie Code-Schnipsel zu beheben scheint verdächtig:

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

Insbesondere die strcat(). Ist File_Gets() null-beendend, was es in buf[] schreibt? Wenn nicht, dann kann strcat() über die Grenzen von lesen/kopieren, da es Null-Terminierung benötigt, um zu wissen, wann zu stoppen ist.

EDIT: Ich sollte darauf hinweisen, dass dies einer der Gründe ist, strncat() über strcat() zu empfehlen. Die Verwendung der "n" -Varianten der Kettenfunktionen (d. H. strncat(), strncpy(), strncmp()) hilft, Pufferüberläufe zu verhindern, und ist im Allgemeinen eine gute Vorgehensweise.