![]() |
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? |
AW: Delphi Variable Initialization
Zitat:
Im Normalfall wird eine StringList so instanziiert:
Delphi-Quellcode:
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".
SL := TStringList.Create;
Um das zu verhindern kann man entweder
Delphi-Quellcode:
aufrufen oder das "händisch" machen indem die StringList mit Free freigegeben und dann der Variablen
FreeAndNil(SL)
Delphi-Quellcode:
zugewiesen wird.
nil
Der Aufruf von Free überprüft selbst auch noch, ob das Objekt nicht bereits
Delphi-Quellcode:
ist.
nil
Zitat:
So würde man es bei einer lokalen Variable machen:
Delphi-Quellcode:
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.
procedure CreateInstance;
var SL: TStringList; begin SL := TStringList.Create; try // Do something finally SL.Free; end; end; |
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.
|
AW: Delphi Variable Initialization
Zitat:
![]() Zitat:
|
AW: Delphi Variable Initialization
Was ich meinte ist, wenn das irgendwann mal geändert wird, hat man den Salat.
|
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.
|
AW: Delphi Variable Initialization
Man benutzt ja sowieso keine globalen Variablen, von daher ist das eigentlich egal ;)
|
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:
Oder wie macht ihr das mit lokalen Variablen?
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; |
AW: Delphi Variable Initialization
Genau so.
|
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 08:45 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