Come verificare se la memoria a quale puntatore p è stata assegnata correttamente?Come controllare la deallocazione della memoria
risposta
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)
In che modo l'impostazione dei puntatori a 0 aiuta a risolvere questo problema? –
Per evitare problemi di doppio omaggio. Potrebbe essere ciò che l'OP vuole, dopo tutto. –
Peccato impostando i puntatori su 0 è un UB. –
spiacenti risposta, molto corto "Non è possibile"
Utilizzare lo strumento IBM rational purify per verificare la corretta deallocazione della memoria.
- Alcuni strumenti che eseguono analisi del codice statico possono segnalare alcuni problemi relativi alla deallocazione della memoria.
- Usa Valgrind per verificare se si dispone di perdite di memoria
- Evitare puntatori prime - utilizzare i puntatori intelligenti invece
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.
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 ...
Gestione delle eccezioni. Cioè prova/cattura i blocchi.
errato; un distruttore non deve lanciare un'eccezione, quindi questo non farà nulla. –
buon punto. Grazie. –
- 1. come controllare la corruzione della memoria in C++
- 2. memoria deallocazione e le eccezioni
- 3. Assegnazione e deallocazione della memoria nel codice non gestito tramite la piattaforma Invoke (C#)
- 4. Controllare l'utilizzo della memoria in haskell
- 5. Perché la deallocazione è lenta?
- 6. Allocazione di memoria e deallocazione attraverso i contorni delle DLL
- 7. memoria deallocazione di dinamicamente Aggiunto Mesh non funziona
- 8. Come è possibile controllare l'utilizzo della memoria in Cordova?
- 9. iPhone dev: delegati, notifiche, annullamento dell'iscrizione prima della deallocazione?
- 10. Come ottenere la dimensione della memoria della variabile?
- 11. Controllare la dimensione della cartella in Bash
- 12. Contatori Perfmon per controllare la perdita di memoria
- 13. Come controllare la lunghezza della coda in Python
- 14. Come controllare la posizione della mia app IDFA
- 15. Come posso controllare la frequenza fotogrammi della mia app?
- 16. Come controllare l'utilizzo del database e della memoria nella nuova console Firebase
- 17. Dimensioni della memoria Java della classe vs della memoria?
- 18. Come controllare la versione sbt?
- 19. Come profilo l'utilizzo della memoria?
- 20. Come analizzare la memoria tramite Android Studio
- 21. la gestione della memoria di sintassi letterale
- 22. Acquisire la proprietà della memoria da CVImageBufferRef
- 23. la corruzione della memoria con std :: initializer_list
- 24. Forzare deallocazione di oggetto cache di grandi dimensioni in Java
- 25. Android ==> Analisi della memoria ==> Analizzatore di memoria Eclipse?
- 26. Come controllare la memoria durante l'utilizzo di Keras con backoff tensorflow?
- 27. È possibile modificare la dimensione della pagina della memoria virtuale?
- 28. Come aumentare la dimensione dell'heap della memoria su IntelliJ IDEA?
- 29. Come modificare la mappa della memoria U-Boot
- 30. Come funziona la gestione della memoria su Xamarin.IOS
Ulteriori dettagli necessari: come è stata allocata inizialmente la memoria? e * perché * è necessario verificare se è stato deallocato? –
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
Yeap, qual è il vero problema che stai cercando di risolvere? – sharptooth