A következő lenne a kérdés: milyen programmal lehet ellenőrizni, hogy leak-e egy program, ami nem valgrind? Merthogy ez utóbbi egy nagy bughalmaz, ha épp nem crash-el, akkor is olyan memóriákra sír, amik felszabadításra kerülnek.
Példa valgrind crash-re:
==6683== Memcheck, a memory error detector.
==6683== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==6683== Using LibVEX rev 1854, a library for dynamic binary translation.
==6683== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==6683== Using valgrind-3.3.1-Debian, a dynamic binary instrumentation framework.
==6683== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==6683== For more details, rerun with: -v
==6683==
==6683==
==6683== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 13 from 1)
==6683== malloc/free: in use at exit: 121,292,077 bytes in 2,713,074 blocks.
==6683== malloc/free: 3,449,783 allocs, 736,709 frees, 4,286,394,186 bytes allocated.
==6683== For counts of detected errors, rerun with: -v
Memcheck: mc_leakcheck.c:710 (vgMemCheck_do_detect_memory_leaks): Assertion '(lc_shadows[i]->data + lc_shadows[i]->szB <= lc_shadows[i+1]->data ) || (lc_shadows[i]->data =adows[i+1]->data && lc_shadows[i]->szB == lc_shadows[i+1]->szB)' failed.
==6683== at 0x3801A41D: report_and_quit (m_libcassert.c:140)
==6683== by 0x3802B5CE: vgPlain_do_syscall (m_syscall.c:463)
==6683== by 0x3: ???
==6683== by 0x3F7: ???
==6683== by 0x626A7007: ???
==6683== by 0x59: ???
Példa olyan memóriakezelésre, amit nem képes követni:
mystruct **mylist=NULL;
int bennevan_hanincsaddhozza()
{
mystruct *ms=malloc(sizeof(mystruct);
i=keres(mylist,ms);
if(i==-1) { //nincs benne
i=pozicio_beszor(mylist,ms);
mylist[i]=ms;
}
//direkt nincs free(ms), mert akkor a mylistben halott pointer lenne!
}
//helyette egy masik fgv vegzi a felszabaditast
int regiek_torol()
{
for(i=0;i<mylist_length;i++) if(nemkellmar(mylist[i])) free(mylist[i]);
}
Magyarán ha van egy pointerlistád, amibe az egyik függvény berak lefoglalt memória pointereket, egy másik függvény meg felszabadítja ha már nem kell, akkor a valgrind csődöt mond. Na de bazz. Nem olyan ritka dolog, hogy nem egy kódblokkon belül kerül lefoglalásra és felszabadításra egy memória....
Szóval a kérdés: milyen alternatívák léteznek?