View Single Post
Old 03-04-2011, 23:39   #1
Barbalbero
Registered User
 
Iscritto dal: Aug 2006
Messaggi: 305
[C++] double free alla prima free()

Ho una struttura
Codice:
struct Struttura{
        tipo **matrice;
};
più avanti nel codice utilizzo la struttura:

Codice:
Struttura * var = (Struttura *) malloc(sizeof(Struttura));
    Struttura->matrice = (tipo **) malloc(dimensione * sizeof (tipo *));
    for (int i = 0; i < altra_dimensione; i++) {
        Struttura->matrice[i] = (tipo *) malloc(altra_dimensione * sizeof (tipo));
    }
;

più avanti ancora decido di deallocare tutto:

Codice:
for(int i=0;i<dimensione;i++){
     free(Struttura->matrice[i]);
}
...
Alla prima occasione in cui chiamo la free() ottengo un errore:
double free or corruption (out): 0x08ccb060

Ho guardato ovunque, non ho trovato una soluzione che funzioni.
C'è qualche errore in ciò che faccio?
Se non chiamo la free il programma funziona correttamente, e anzi vi dirò di più... se al posto del ciclo per deallocare la matrice ci metto un doppio ciclo per stampare i valori della matrice, me li stampa senza problemi. Questo significa che la memoria non è stata già deallocata e non è nemmeno corrotta.

(Nota: Se non dealloco la matrice ma dealloco la Struttura, funziona, ma suppongo che resti della memoria spazzatura, per questo insisto per deallocare la matrice. Ho notato che se ciclo l'esecuzione del programma infinite volte, la memoria allocata continua a crescere, quindi suppongo che sia a causa di questa mancata deallocazione)

(per semplificare il codice non l'ho scritto, ma in realtà la struct Struttura è puntata da un puntatore all'interno di un'altra struttura, ma non credo che la cosa sia rilevante)

Ultima modifica di Barbalbero : 03-04-2011 alle 23:42.
Barbalbero è offline   Rispondi citando il messaggio o parte di esso