![]() |
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
Wie aber gubbe schon sagte, sehr gefährlich das richtig frei zugeben! Besser:
Delphi-Quellcode:
so ungefähr
var
MyStringList: TStringList; begin MyStringList := TStringList.Create; try MeineProc(MyStringList); // Weitere Anweisungen mit der gefüllten Stringlist ... finally MyStringList.Free; // reicht aus end; end; Ich sehe gerade, das hatte gubbe auch schon (besser) geschrieben... |
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
Habe das so umgebaut und bei mehreren Tests war das Ergebnis jeweils "0 unfreed Memory Blocks" Und was neues gelernt habe ich dabei auch. Eine Frage noch. Wann nutze ich FreeAndNil() und wann .Free ? Vielen Dank an alle. Nun kann ich weiter basteln. Die nächsten Fragen kommen bestimmt |
AW: Brauche Hilfe bei der Fehlersuche.
nur Free machst du, wenn wie in meinem Beispiel die Objektvariable lokal angelegt wurde. Nach dem Verlassen des Blocks ist sie automatisch undefiniert (und ihr Speicher verloren, wenn nicht vorher freigegeben!)
FreeAndNil wenn nicht ganz klar ist, ob die Objektvariable evtl. nach der Freigabe noch irgendwo verwendet werden könnte. Wenn man dann vor jeder Verwendung auf nil abprüft, sollten ungültige Zugriffe (weil die Variable schon zerstört wurde) weitgehend ausgeschlossen sein. |
AW: Brauche Hilfe bei der Fehlersuche.
Moin...8-)
Zitat:
Bsp:
Delphi-Quellcode:
function CreateAndFillBlubbList(Bla: Integer): TStringList;
|
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
|
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
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; |
AW: Brauche Hilfe bei der Fehlersuche.
Hallo,
Zitat:
Folgendes geht: FreeAndNil(x); FreeAndNil(x); Folgendes nicht: x.Free; x.Free; FreeAndNil prüft, ob die Variable nicht bereits schon nil ist. |
AW: Brauche Hilfe bei der Fehlersuche.
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:38 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz