Einzelnen Beitrag anzeigen

Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:24
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.
  Mit Zitat antworten Zitat