2010-11-10 13 views
11

Come verificare se la memoria a quale puntatore p è stata assegnata correttamente?Come controllare la deallocazione della memoria

+0

Ulteriori dettagli necessari: come è stata allocata inizialmente la memoria? e * perché * è necessario verificare se è stato deallocato? –

+0

A livello di applicazione, non può. Se tuttavia stai lavorando su livelli di kernel di livello molto basso, ci potrebbero essere dei modi per farlo. – Chubsdad

+1

Yeap, qual è il vero problema che stai cercando di risolvere? – sharptooth

risposta

12

In poche parole: non si può.

Scopri strumenti come Valgrind per aiutarti a risolvere i problemi di perdite di memoria.

Alcune altre cose che si dovrebbero prendere in considerazione:

  • Utilizzare i puntatori intelligenti in modo che non si dispone di non pensare la gestione della memoria,
  • Impostare le puntatori a 0 dopo averli libero, in modo che un ulteriore delete ha alcun effetto,
  • utilizzare le classi standard (vector, ...) invece di posizionare il proprio,
  • Infine, non utilizzare i puntatori (in realtà si può quasi)
+0

In che modo l'impostazione dei puntatori a 0 aiuta a risolvere questo problema? –

+0

Per evitare problemi di doppio omaggio. Potrebbe essere ciò che l'OP vuole, dopo tutto. –

+0

Peccato impostando i puntatori su 0 è un UB. –

5

spiacenti risposta, molto corto "Non è possibile"

1
  1. Alcuni strumenti che eseguono analisi del codice statico possono segnalare alcuni problemi relativi alla deallocazione della memoria.
  2. Usa Valgrind per verificare se si dispone di perdite di memoria
  3. Evitare puntatori prime - utilizzare i puntatori intelligenti invece
2

Definire con successo! Definisci deallocato!

Dopo aver deallocato la memoria (se è libera o eliminata) non è necessario utilizzare nuovamente quel puntatore. Tutte le altre ipotesi sono irrilevanti.

Dopo tutto, si chiama il runtime C/C++ per deallocare la memoria, ma il runtime C/C++ chiama anche le funzioni del sistema operativo per liberare la pagina. Si potrebbe persino avere un allocatore di memoria personalizzato sopra il runtime C/C++ che ad es. utilizza la memorizzazione nella cache per implementare un algoritmo di allocazione della memoria più veloce.

Tutti questi livelli possono conservare la memoria deallocata da soli (a causa della frammentazione o semplicemente perché a loro piace tenerlo a se stessi) o possono dire al layer sottostante di deallocarlo. Tutto può succedere, non usare più quel puntatore.

0

In C++, si può tranquillamente assumere che la deallocazione non fallisce mai. I distruttori non devono lanciare eccezioni e la memoria effettiva riservata non dovrebbe mai mancare di essere rilasciata, quindi, dati questi due punti, nulla può andare storto.

Tuttavia, se si elimina un puntatore che è già stato eliminato, il programma si bloccherà probabilmente. Tuttavia, questo non è un problema con la deallocazione: l'originale delete ha funzionato correttamente. Si tratta di un problema con la gestione della memoria del programma se si tenta di eliminare un puntatore due volte, ma raramente è necessario con moderni STL e puntatori intelligenti come std::vector, std::unique_ptr, ecc ...

0

Gestione delle eccezioni. Cioè prova/cattura i blocchi.

+5

errato; un distruttore non deve lanciare un'eccezione, quindi questo non farà nulla. –

+0

buon punto. Grazie. –

Problemi correlati