Questions & answers (italian)

Errore in runtime

Errore in runtime

di MATTEO MENEGATTI -
Numero di risposte: 3

Salve a tutti, 

Nell'eseguire il programma ParticleMean_v2 mi sono imbattuto in un errore in runtime che non avevo mai visto prima.

Mettendo qualche cout qui e là noto che il programma si blocca dopo circa una 15ina di cicli/evento eseguiti senza problemi e non noto niente di diverso in quella particolare iterazione rispetto alle precedenti.

Il messaggio di errore restituito è "free(): double free detected in rcache2".

Online non ho trovato nessuna spiegazione esaustiva.

Specifico che nel programma non ho mai utilizzato esplicitamente il comando free() su un oggetto.

Mi chiedevo se qualcuno sapesse cosa significa questo errore o a che cosa potrebbe essere dovuto, in modo da poter trovare più facilmente la parte problematica.

Grazie in anticipo.

In riposta a MATTEO MENEGATTI

Ri: Errore in runtime

di Paolo Ronchese -

Probabilmente viene eseguito un "delete" due volte sullo stesso oggetto, oppure c'e' un qualche altro errore nella gestione della memoria. La funzione "free" puo' venire chiamata "dietro le quinte" da qualche altro operatore o da sistema operativo stesso.


In riposta a Paolo Ronchese

Ri: Errore in runtime

di MATTEO MENEGATTI -

RISOLTO

Pubblico la soluzione in caso dovesse capitare a qualcun altro questo errore.

Ne approfitto per chiedere conferma sulla mia deduzione.

Ho risolto il problema perché ho notato che nel decostruttore della classe Event, per cancellare l'array di particelle utilizzavo  un ciclo lungo come il massimo di particelle (10) ossia quanto è effettivamente lungo l'array. Invece non ho più l'errore se quel ciclo lo faccio solo per il numero effettivo di particelle presenti (2 o 3 comunque diverso in base allo specifico evento).

Quindi io capisco che quell'errore non era un'effettiva doppia chiamata a free(), ma piuttosto un tentativo di liberare una posizione dell'array che di fatto esiste, ma non contiene niente.

Questo è dovuto, immagino, al fatto che in questo caso sia un array di puntatori, quindi sebbene l'array abbia 10 elementi, gli ultimi 8 puntino a celle di memoria mai stanziate, quindi quando chiamo il delete a un puntatore "vuoto" questo solleva un errore, è corretto?

In riposta a MATTEO MENEGATTI

Ri: Errore in runtime

di Paolo Ronchese -

Buongiorno

la sua deduzione e' corretta.

A lezione una volta ho fatto l'osservazione "creare un array di puntatori non significa creare anche gli oggetti a cui essi dovrebbero puntare". Ovviamente un conto e' sentirlo e un altro conto "sbatterci contro". Adesso e' sicuro di averlo capito bene, e difficilmente fara' lo stesso errore. Se le puo' interessare, anch'io ho imparato quanto fosse importante esattamente nello stesso modo ammiccante .

Saluti

Paolo R.