Come suggerito, esistono già strumenti eccellenti come Valgrind per farlo.
Ulteriori:
vorrei fare questo senza alcun utility esterne per la pratica
Questo è interessante e sono sicuro che sarebbe stato appagante,
È possibile utilizzare macro trucco per rilevare ad esempio l'utilizzo della memoria e errori di perdita, in effetti scrivere il proprio rilevatore di perdite pulito. Dovresti essere in grado di farlo finché hai una singola allocazione e una funzione di deallocazione nel tuo progetto.
#define malloc(X) my_malloc(X, __FILE__, __LINE__, __FUNCTION__)
void* my_malloc(size_t size, const char *file, int line, const char *func)
{
void *p = malloc(size);
printf ("Allocated = %s, %i, %s, %p[%li]\n", file, line, func, p, size);
/*Link List functionality goes in here*/
return p;
}
Si mantiene un elenco collegato di indirizzi assegnati con il file e il numero di riga da cui è stato assegnato. Si aggiorna la lista dei collegamenti con voci nel proprio malloc
.
Come sopra è possibile scrivere un'implementazione per free
, in cui si controlla che le voci dell'indirizzo vengano richieste per essere liberate rispetto all'elenco collegato. Se non c'è una voce corrispondente è un errore di utilizzo e puoi segnalarlo così.
Alla fine del programma si stampa o si scrive il contenuto dell'elenco collegato in un file di registro. Se non ci sono perdite, l'elenco collegato non deve contenere voci, ma se ci sono alcune perdite, il file di registro fornisce la posizione esatta in cui è stata allocata la memoria.
Si noti che nell'utilizzo di questo trucco macro, si perde il controllo di tipo che offre le funzioni, ma è un piccolo trucchetto che uso molte volte.
Spero che questo aiuti e tutto il meglio :)
cosa c'è che non va con Valgrind? –
@MitchWheat ho detto che non posso usare qualsiasi utilità esterna –
Bene, se questo è per l'apprendimento, si può imparare come valgrind lo fa ... –