Ich habe einen Code wie folgt: Ich habe Log zweimal zugewiesen, gibt es ein potenzielles Speicherleck für das erste & amp; log?
%Vor% Ja, der Code wird undicht, da asprintf
den vorherigen Zeiger weder überprüft noch versucht, ihn wiederzuverwenden. Daher ist die Erinnerung einfach verloren. Der beste Weg, das Problem in Ihrem Beispiel zu vermeiden, wäre, den Code als
Auf diese Weise wird der Puffer einmal zugewiesen und korrekt freigegeben.
Alternativ könnten Sie zwei Zeiger verwenden
%Vor%gibt es [a] [...] Speicherleck
Definitiv ja.
Der Verweis auf den durch den 1. Aufruf von aprintf()
zugewiesenen Speicher wird durch den 2. Aufruf von aprintf()
überschrieben, so dass keine Chance mehr besteht, free()
dem 1. belegten Speicher zuzuordnen, er "leckt" / p>
Um dies zu beheben, führen Sie einen 2. (temporären) Zeiger ein:
%Vor%Ein anderer und wahrscheinlich billiger (schneller, da einige Sachen während der Kompilierungszeit behandelt werden, aber Laufzeit) Ansatz zu diesem Problem wäre das folgende:
%Vor%Das Hinzufügen von Fehlerprüfungen bei Systemaufrufen wird dem Leser als Übung überlassen.
Ein dritter Ansatz hierfür, der nur Standard-C-Funktionen verwendet, ist:
%Vor%Ein anderer und wahrscheinlich billiger (schneller, da einige Sachen während der Kompilierungszeit behandelt werden, aber Laufzeit) Ansatz zu diesem Problem wäre das folgende:
%Vor% Ja. Wahrscheinlich wird asprinf
nicht auf denselben Speicherplatz treffen und hat keine Kenntnis von den vorherigen Anrufen.