Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Variable Initialization (https://www.delphipraxis.net/193536-delphi-variable-initialization.html)

Edelfix 11. Aug 2017 12:13

Delphi Variable Initialization
 
Hallo,

ich habe eine Frage zum Thema: Variable initialization.

Die Frage ist bei uns aufgekommen beim Umstieg von Delphi XE nach Delphi XE7.

Mein erfahrener Kollege meint das die Variablen in Delphi XE alle grundsätzlich auf nil oder null definiert wahren.

In Delphi XE7 haben wir öfter das Phänomen das eine Variable nicht definiert ist und beliebige werte enthält.

Aufgefallen ist uns das zum Beispiel bei freigeben einer String Liste mit SL.Free.

Die String Liste war mit create erzeugt aber nicht definiert.

Dadurch kam es zu Zugriffsverletzungen beim Freigeben die es bei Delphi XE nicht gab.

Hat sich etwas in der Delphi Version geändert oder ist es eine Einstellung in den Optionen die wir nicht bedacht haben?

Aviator 11. Aug 2017 12:24

AW: Delphi Variable Initialization
 
Zitat:

Zitat von Edelfix (Beitrag 1378587)
Die String Liste war mit create erzeugt aber nicht definiert.

Den Satz verstehe ich nicht so ganz.

Im Normalfall wird eine StringList so instanziiert:
Delphi-Quellcode:
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
Delphi-Quellcode:
FreeAndNil(SL)
aufrufen oder das "händisch" machen indem die StringList mit Free freigegeben und dann der Variablen
Delphi-Quellcode:
nil
zugewiesen wird.

Der Aufruf von Free überprüft selbst auch noch, ob das Objekt nicht bereits
Delphi-Quellcode:
nil
ist.

Zitat:

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.

bra 11. Aug 2017 12:31

AW: Delphi Variable Initialization
 
Laut Google sind in Delphi globale Variablen immer auf 0/nil initialisiert, lokale aber unintialisiert, also undefined. Darauf verlassen würde ich mich aber nicht.

jaenicke 11. Aug 2017 12:38

AW: Delphi Variable Initialization
 
Zitat:

Zitat von bra (Beitrag 1378591)
Laut Google sind in Delphi globale Variablen immer auf 0/nil initialisiert, lokale aber unintialisiert, also undefined. Darauf verlassen würde ich mich aber nicht.

Da kann man sich schon drauf verlassen, das ist auch dokumentiert, einfach mal in die Doku schauen:
http://docwiki.embarcadero.com/RADSt...o/en/Variables
Zitat:

If you do not explicitly initialize a global variable, the compiler initializes it to 0. Object instance data (fields) are also initialized to 0. On the Wiin32 platform, the contents of a local variable are undefined until a value is assigned to them.

bra 11. Aug 2017 12:41

AW: Delphi Variable Initialization
 
Was ich meinte ist, wenn das irgendwann mal geändert wird, hat man den Salat.

jaenicke 11. Aug 2017 12:53

AW: Delphi Variable Initialization
 
Wenn etwas so fest dokumentiert ist, vor allem solch eine grundlegende Geschichte, dann kann man schon davon ausgehen, dass das auch so bleibt. Denn bei einer Änderung würden viele Quelltexte nicht mehr funktionieren.

DeddyH 11. Aug 2017 12:53

AW: Delphi Variable Initialization
 
Man benutzt ja sowieso keine globalen Variablen, von daher ist das eigentlich egal ;)

Edelfix 11. Aug 2017 14:54

AW: Delphi Variable Initialization
 
Danke schon einmal für die Beiträge.

Wie ist dann die richtige Vorgehensweise bei lokalen Variablen?

Wenn es heißt: "Laut Google sind in Delphi globale Variablen immer auf 0/nil initialisiert, lokale aber uninitialisiert, also undefined."

Beispiel:
Delphi-Quellcode:
procedure Foo;
var
  iLokaleVar: Integer;
begin
  //wenn volgende Zeile fehlt dann mekert der Compiler: "[dcc32 Warnung] Muster.pas(7): W1036 Variable 'iLokaleVar' ist möglicherweise nicht initialisiert worden"
  iLokaleVar:=0; //sicherheitshalber definieren.
  if Vorfall_1 then
  iLokaleVar := iLokaleVar + 1;
  if Vorfall_2 then
  iLokaleVar := iLokaleVar + 1;
  if Vorfall_3 then
  iLokaleVar := iLokaleVar + 1;

  if iLokaleVar>0 then
    showmessage('Achtung es gab ein Vorfall!');
end;
Oder wie macht ihr das mit lokalen Variablen?

DeddyH 11. Aug 2017 15:05

AW: Delphi Variable Initialization
 
Genau so.

Glados 11. Aug 2017 15:48

AW: Delphi Variable Initialization
 
Wenn dann doch gleich so
Delphi-Quellcode:
if Vorfall_1 or Vorfall_2 or Vorfall_3 then
 iLokaleVar := iLokaleVar + 1;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:33 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz