Forum: FreePascal
by HHennig,
26. Aug 2019
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...
Forum: FreePascal
by HHennig,
26. Aug 2019
Das ist auch grundsätzlich korrekt, nur brauchst/darfst du die Stringlist nicht vorher erzeugen, denn das macht ja deine Funktion.
Wie aber gubbe schon sagte, sehr gefährlich das richtig frei zugeben!
Besser:
var
MyStringList: TStringList;
begin
Forum: FreePascal
by HHennig,
26. Aug 2019
Wenn deine Funktion eine Stringlist zurückgibt, ist das vorherige Erzeugen ausserhalb der Funktion definitiv das Problem; der angelegte Speicher wird nicht freigegeben da der Objektzeiger durch deine Funktionsrückgabe umgebogen wurde!
Forum: FreePascal
by HHennig,
26. Aug 2019
try..finally könnte evtl. schon die Lösung sein:
procedure TForm1.alCalcExecute(Sender: TObject);
var
StrListCalc: TStringList;
begin
strListCalc := TStringList.Create;
ZeissCFG := TClassZeissCFG.Create;