Das Problem ist, dass, wenn realloc()
fehlschlägt, die Funktion NULL zurückgibt, aber der ursprüngliche Block immer noch zugewiesen wird. Sie haben jedoch gerade den Zeiger auf diesen Block überschrieben und können ihn nicht mehr freigeben (oder verwenden).
Wenn realloc () fehlschlägt, wird null zurückgegeben und der ursprüngliche Block wird nicht freigegeben . Diese Zeile:
%Vor%überprüft den Rückgabewert nicht. Wenn also realloc () fehlschlägt, wird null in Hash- & gt; -Spalten geschrieben und der ursprüngliche Block wird durchgesickert.
Valgrind sagt nicht, dass das Leck in der realloc
-Zeile passiert - es sagt, dass der Speicher, der von dieser realloc
-Zeile zugeteilt wurde, der Speicher ist, der irgendwann geleakt wird. Valgrind weiß nicht, wo es ist - es weiß nur, dass du keinen Bezug mehr zu diesem Speicher hast, also wäre es unmöglich, free
it. (Das OP kann das wissen, aber es ist klar, dass viele der Antworter dies nicht tun!)
Kurz gesagt, der Code, den Sie eingefügt haben, verursacht das Problem nicht (obwohl das Problem, das Michael Burr aufwirft, definitiv real ist, aber da Sie nicht einmal nach einem NULL
suchen, das von realloc
zurückgegeben wurde. .)
Irgendwo in deinem Code sollte ein free(Hash->Columns)
sein, das jetzt nicht da ist. Finde diesen Ort - wahrscheinlich kurz bevor %%_de% selbst freigegeben wurde - und füge ihn hinzu.
Nicht sicher, dass dies das Problem ist, aber es ist möglicherweise problematisch. Auf der Hilfeseite für realloc()
:
RÜCKGABEWERT
Nach erfolgreichem Abschluss mit einer Größe ungleich 0 gibt
realloc()
einen Zeiger auf den (möglicherweise verschobenen) zugewiesenen Speicherplatz zurück. Wenn die Größe 0 ist, wird entweder ein Nullzeiger oder ein eindeutiger Zeiger zurückgegeben, der erfolgreich anfree()
übergeben werden kann. Wenn nicht genügend Arbeitsspeicher verfügbar ist, gibtrealloc()
einen Nullzeiger zurück und setzt errno auf [ENOMEM].
Wenn nicht genügend Platz für das erweiterte Objekt vorhanden ist, wird das alte Objekt noch gültig und nicht freigegeben, aber realloc()
gibt NULL
zurück. Sie sollten also das Rückgabeergebnis von realloc()
in einer separaten Variablen speichern, diese Variable für NULL
überprüfen und, falls dies nicht der Fall ist, diese Hash->Columns
zuweisen.
Aha-asveikaus Kommentar:
Aber wenn das das Leck wäre, das er in Valgrind sieht, würde es eine Null-Dereferenz geben und er würde zusammenbrechen. Ich denke, es gibt Code, den er nicht zur Verfügung stellt, der ein Leck hat.
hat mich zu einem anderen Problem geführt - die Datenstruktur, die Sie in der Größe ändern, enthält Zeiger auf Strings, die mit strdup()
zugewiesen sind. Wenn Ihr realloc()
-Aufruf die Zuweisung kleiner macht, werden Sie diese Zeiger verlieren, ohne sie vorher ordnungsgemäß zu löschen. Ich glaube, dass asveikau richtig ist, worüber sich valgrind beschweren kann.
Tags und Links c memory-leaks c++ memory-management