Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Come accorgersi di un memory leak?
Forum - C/C++ - Come accorgersi di un memory leak?

Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 12:35
Sabato, 29/01/2011
Ciao a tutti! Sto creando un programmino per PSP che sfrutta le SDL, ma lo sto debuggando su PC. Dato che, ogni volta che mi dimentico di deallocare un oggetto (delete), la PSP crasha, volevo sapere se esiste un modo, su PC, per accorgersi di un eventuale memory leak. Finora l'unica soluzione che mi è venuta in mente è quella di creare una superclasse comune a tutte le classi che ho creato, che incrementi una variabile di classe di uno al momento della creazione e che la decrementi al momento della deallocazione, stampandone il valore su schermo al momento della chiusura del programma. Il problema è che, con questo metodo, non mi accorgerei comunque di array allocati con "new" e non deallocati. Esiste un metodo migliore?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:37
Sabato, 29/01/2011
Il tuo approccio non è male, ma ha delle limitazioni.

Un approccio più sofisticato, ma molto complesso, sarebbe quello di scrivere un tuo memory allocator e installarlo come new_handler. E' una di quelle features del C++ che sono tra le più utili e al tempo stesso le più sconosciute.

Ma la difficoltà di realizzazione potrebbe essere eccessiva per un piccolo progetto, quindi ti consiglio di seguire una strada diversa.

Dato che usi le SDL, il tuo progetto compilerà con pochissime modifiche anche su Linux.
Crea una versione Linux del tuo programma e usa Valgrind per detectare i memory leaks. Questo tool installa un proprio new_handler e sostituisce la malloc standard, dotandola di sistema di resource-tracking.

Il debugging della memoria, essendo un processo totalmente indipendente dalla piattaforma, puoi così farlo su Linux ed avrai la certezza che questo continuerà a funzionare anche su PSP.

Se usi Windows è un casino, ti consiglio vivamente in tal caso di procurarti un programma di virtualizzazione come VirtualBox e di installare Linux in virtuale per fare queste prove.

Ciao ;)

PM Quote
Avatar
Stefano (Ex-Member)
Rookie


Messaggi: 32
Iscritto: 27/12/2007

Segnala al moderatore
Postato alle 19:04
Sabato, 29/01/2011
Ciao! Anche io ho avuto lo stesso problema tempo fa per alcune applicazioni (non per psp sfortunatamente) che crashavano a causa di leaks.
Ho risolto utilizzando visual studio e visual leak detector: Ti basta includere un header e al termine del debug avrai il dump di eventuali memory leak (Inclusa la riga di allocazione (con un doppio click te lo apre in automatico) e tutta la stack trace).

Un altro approccio è quello di crearti un garbage collector (tipo questo: http://www.codeproject.com/Tips/96821/A-little-garbage-col ... che cancella i puntatori alla distruzione dell'oggetto stesso.

Fammi sapere

Ultima modifica effettuata da Stefano il 29/01/2011 alle 19:05
PM Quote
Avatar
napco (Normal User)
Pro


Messaggi: 64
Iscritto: 16/04/2010

Segnala al moderatore
Postato alle 20:32
Sabato, 29/01/2011
Grazie ragazzi, mi avete fornito un sacco di idee! Fortunatamente ho già un PC con linux installato, quindi non dovrei aver problemi. Per sicurezza mi darò un'occhiatina anche al new_handler e alla libreria per VC++... Può far comodo saperli utilizzare!

PM Quote