2013-06-10 18 views
5

Sto avendo perdite di memoria in un programma più grande e credo che questa sia la causa di esso.Il puntatore del char è struct array memory leak

#include <stdlib.h> 
#include <Windows.h> 

typedef struct _struct{ 
    char* name; 
} str; 

int main() { 
    system("PAUSE"); 

    str* Character = (str*)malloc(sizeof(str) * 20000); 

    for(int i = 0; i < 20000; i++){ 
     Character[i].name = (char*)malloc(20000); // Assign memory. 
    } 

    for(int i = 0; i < 20000; i++){ 
     free(Character[i].name);   // Free memory. 
    } 

    free(Character); 
    system("PAUSE"); 
} 

Memoria alla prima pausa: ~ 500 K.

Memoria alla seconda pausa: ~ 1,7 M.

Utilizzo di VS2012 per il test. Qualche idea?

+1

Il tuo codice sembra corretto. Come stai misurando l'uso della memoria? È possibile che il tuo gestore di heap non abbia semplicemente compresso il suo heap seguendo le tue chiamate a 'free'? In questo caso, la memoria aggiuntiva verrebbe assegnata al tuo processo ma non sarebbe utilizzata dal tuo programma, quindi sarebbe effettivamente disponibile per altri codici da allocare. – simonc

+0

Quando usi malloc, assicurati di verificare che la memoria sia effettivamente allocata se (Carattere == NULL) – hazzelnuttie

+0

non devi eseguire il casting del ritorno da malloc. Questo è C e puoi assegnare un vuoto * a qualsiasi cosa. –

risposta

4

Come si misura la quantità di memoria occupata dal programma? Una cosa che mi viene in mente è che stai osservando le dimensioni del set di lavoro di cui il sistema operativo tiene traccia. Dato che hai allocato e liberato molta memoria, la dimensione di quel set è aumentata. Alcuni sistemi operativi modificano la dimensione del working set dopo un po ', altri no. Quale sistema operativo stiamo guardando qui?

+0

Windows 7 Ultimate e utilizzo della memoria dal Task Manager – Marc

+0

Non sono sicuro di cosa sia Windows (verificherò in seguito, o qualcun altro potrebbe compilare), ma probabilmente non mostra ciò che ti aspetti. I moderni sistemi operativi gestiscono la memoria di processo in modo lordo e pigro per risparmiare sull'elaborazione e potrebbero ritardare la deallocuzione delle pagine. Anche l'implementazione di malloc e free potrebbe riservare memoria. Se vuoi essere sicuro, usa uno strumento come valgrind per verificare la presenza di perdite. – idoby

+0

L'ho appena eseguito con DrMemory e ho trovato 3 (1536 byte) di possibili perdite con 319 allocazioni ancora raggiungibili. – Marc

3

Quando si chiama malloc, la memoria viene allocata nell'heap. Se sullo heap non è rimasto spazio sufficiente, il programma chiederà al sistema operativo più memoria e verrà acquisito un altro blocco. La memoria acquisita dal sistema operativo di solito non viene restituita fino a quando il programma non termina (anche se questo dipende dal sistema operativo).

La dimensione del programma da sola non può normalmente essere utilizzata per verificare la presenza di perdite di memoria! Utilizzare Valgrind o uno strumento simile per verificare la memoria che non ottiene mai free d.

-1

str * Carattere = (str *) malloc (sizeof (str) * 20000);

Nella riga sopra si assegna la memoria trovando la dimensione della struttura. Qui la dimensione della struttura che otterrai sarà la dimensione della larghezza del puntatore e non la dimensione del carattere.

supponiamo per esempio se la larghezza del puntatore è di 32 bit, verrà allocata (4 * 20000) = 80000 byte.

Se si desidera allocare per 20000 struct di,

str * Character = (str *) malloc (sizeof (char) * 20000);

+1

str * Il carattere è una matrice di strutture, non di caratteri (il nome confuso posso essere d'accordo) quindi sizeof (str) è corretto –

Problemi correlati