asprintf (): Wie man die Zeiger freigibt?

8

Ich habe einen Code wie folgt: Ich habe Log zweimal zugewiesen, gibt es ein potenzielles Speicherleck für das erste & amp; log?

%Vor%     
Howard Shane 04.09.2015, 20:25
quelle

3 Antworten

6

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

neu zu schreiben %Vor%

Auf diese Weise wird der Puffer einmal zugewiesen und korrekt freigegeben.

Alternativ könnten Sie zwei Zeiger verwenden

%Vor%     
user3386109 04.09.2015, 20:38
quelle
2
  

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%     
alk 04.09.2015 20:38
quelle
0

Ja. Wahrscheinlich wird asprinf nicht auf denselben Speicherplatz treffen und hat keine Kenntnis von den vorherigen Anrufen.

    
Daniel A. White 04.09.2015 20:27
quelle

Tags und Links