Hallo Fragewurm,
char* nextToken(char* str, char *delims, char* ignores)
{
char* buf; // buffer containing the resulting token
…
buf = (char*)calloc(10, sizeof(char));
(buf wird mit dem Token befüllt …)
// rückgeben des Tokens als eigenständiger String…
return (char *)realloc(buf, strlen(buf)+1);
realloc() macht wenig Sinn, wenn die Blockgrössen in dieser Grössenordnung liegen. Um den Verwaltungsaufwand in Grenzen zu halten und den Heap nicht unnütz zu zerstückeln, wird der Speicher immer in Blöcken mit einer festen Grösse, bzw. einem vielfachen davon, angelegt.
Ich weiss jetzt nicht welche Blockgrösse Win, bzw. MSC, verwendet, aber es dürfte im Bereich von 1kB liegen, irgendwo sollte das beschrieben sein.
Wenn also die Blockgrösse bei z.B. 1024 liegt, werden immer vielfache von 1024 Byte angelegt.
Wenn du mit xalloc() einen Block von 1 Byte anlegst, dahinter noch einen Block und dann den ersten wieder freigiebst, kann dieser nur wieder verwendet werden wenn du später noch einen weiteren Block mit 1Byte grösse anlegen willst.
Dies ist der Grund wieso viele Interpreter ab und zu eine Garbagecollection durchführen müssen. In C ist das aber nicht möglich da ja an keiner zentralen Stelle bkannt ist welche Zeiger auf Blöcke wo abgelegt und noch gültig sind.
Warum wird also noch das Leck angezeigt?
Der Compiler kann nur auf Prozedur-Ebene analysieren und ihm fehlt deshalb einfach die Übersicht.
Das kann man auch nicht einfach erweitern, wenn man bedenkt, dass in C auch Zeiger auf Funktionen erlaubt sind und diese Zeiger meist erst zur Laufzeit zugewiesen werden.
In deinem Fall würde ich mit #pragma warning …
die Warnung VOR der Funktion ausschalten und direct NACH der Funktion wieder einschalten, bzw. auf den Default-Wert setzen.
Dadurch kannst du dein Programm ohne Warnungen compilieren, im Sourcecode ist diese Stelle auch gleich entsprechend markiert und an anderen Stellen erhälst du eine Warnung, weil du da einen Fehler gemacht hast.
MfG Peter(TOO)