Die String Liste war mit create erzeugt aber nicht definiert.
Den Satz verstehe ich nicht so ganz.
Im Normalfall wird eine StringList so instanziiert:
SL := TStringList.Create;
Dann enthält SL in dem Fall die die Referenz auf die TStringList Instanz. Wird SL jetzt freigegeben, dann existiert die Instanz nicht mehr. SL zeigt aber immer noch auf die Adresse der vorherigen Instanz. Ein sogenannter "Dangling Pointer".
Um das zu verhindern kann man entweder
FreeAndNil(SL)
aufrufen oder das "händisch" machen indem die StringList mit Free freigegeben und dann der Variablen
nil
zugewiesen wird.
Der Aufruf von Free überprüft selbst auch noch, ob das Objekt nicht bereits
nil
ist.
Zitat von
System.pas:
Delphi-Quellcode:
procedure TObject.Free;
begin
// under ARC, this method isn't actually called since the compiler translates
// the call to be a mere nil assignment to the instance variable, which then calls _InstClear
{$IFNDEF AUTOREFCOUNT}
if Self <> nil then
Destroy;
{$ENDIF}
end;
So würde man es bei einer lokalen Variable machen:
Delphi-Quellcode:
procedure CreateInstance;
var
SL: TStringList;
begin
SL := TStringList.Create;
try
// Do something
finally
SL.Free;
end;
end;
Grundsätzlich sollte man aber Variablen (egal ob String, Integer, ...) immer initialisieren. Ich würde mich nie darauf verlassen wollen, dass eine Variable beim Start der Anwendung nicht doch durch irgendeinen Müll vorbelegt ist.