AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi Variable Initialization

Ein Thema von Edelfix · begonnen am 11. Aug 2017 · letzter Beitrag vom 11. Aug 2017
Antwort Antwort
Seite 1 von 2  1 2      
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#1

Delphi Variable Initialization

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

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:38
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#5

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:41
Was ich meinte ist, wenn das irgendwann mal geändert wird, hat man den Salat.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.582 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:53
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#7

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 12:53
Man benutzt ja sowieso keine globalen Variablen, von daher ist das eigentlich egal
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Edelfix

Registriert seit: 6. Feb 2015
Ort: Stadtoldendorf
214 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 14:54
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?

Geändert von TBx (14. Aug 2017 um 08:21 Uhr) Grund: Delphi-Tags repariert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#9

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 15:05
Genau so.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#10

AW: Delphi Variable Initialization

  Alt 11. Aug 2017, 15:48
Wenn dann doch gleich so
Delphi-Quellcode:
if Vorfall_1 or Vorfall_2 or Vorfall_3 then
 iLokaleVar := iLokaleVar + 1;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:49 Uhr.
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