Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: Brauche Hilfe bei der Fehlersuche.

  Alt 27. Aug 2019, 17:18
Ich glaube das war es jetzt.
Habe das so umgebaut und bei mehreren Tests war das Ergebnis jeweils "0 unfreed Memory Blocks"
Und was neues gelernt habe ich dabei auch.
Noch um es dir klar zu machen wieso das nicht ging:

Eine Delphiklassenvariable ist im Prinzip ein Pointer auf einen Speicherbereich, in dem die Klasse erzeugt wurde. Wenn du nun also in deiner Funktion eine weitere Stringlist erstellst, wird diese einen anderen Speicherbereich haben, also ein neuer Pointer darauf. Durch die Rückgabe dieser erzeugten Klasse, gibst du also nicht den Speicherinhalt zurück, sondern den Pointer auf diesen Speicher. Damit ist deine ausserhalb der Funktion erstellte Variable nicht mehr ein Pointer auf diese Klasse, sondern hat nun den Pointer aus der Funktion zugewiesen. Sie sieht also nun das Objekt der in der Funktion erzeugten Stringlist. Der vorherige Pointer dieser Variable ist nun verloren und der allozierte Speicher kann nicht mehr freigegeben werden, da nun dein Free die in der Funktion erzeugte Klasse freigibt und nicht die erste.

Gewöhn dir aber bitte an, wann immer du ein Objekt erstellst, dieses mit einem try/finally zu schützen. Nur so wird deine Klasse sauber freigeben, wenn innerhalb des Create und Free eine Exception auftritt.

Delphi-Quellcode:
x := TMeinObjekt.Create;
try
  x.TueIrgendwas;
finally
  x.Free; // Kannst auch FreeAndNil verwenden. Ist im prinzip das Selbe, nur dass danach x = nil ist.
end;

Geändert von Rolf Frei (27. Aug 2019 um 17:22 Uhr)
  Mit Zitat antworten Zitat