it-swarm.com.de

Werden Delphi-Variablen standardmäßig mit einem Wert initialisiert?

Ich bin neu in Delphi und habe einige Tests durchgeführt, um festzustellen, auf welche Objektvariablen und Stapelvariablen standardmäßig initialisiert wird:

TInstanceVariables = class
  fBoolean: boolean; // always starts off as false
  fInteger: integer; // always starts off as zero
  fObject: TObject; // always starts off as nil
end;

Dies ist das Verhalten, das ich von anderen Sprachen gewohnt bin, aber ich frage mich, ob es sicher ist, sich in Delphi darauf zu verlassen. Ich frage mich zum Beispiel, ob dies möglicherweise von einer Compilereinstellung abhängt oder auf verschiedenen Computern möglicherweise unterschiedlich funktioniert. Ist es normal, sich auf initialisierte Standardwerte für Objekte zu verlassen, oder legen Sie alle Instanzvariablen explizit im Konstruktor fest?

In Bezug auf Stapelvariablen (auf Prozedurebene) zeigen meine Tests, dass unitialisierte Boolesche Werte wahr sind, unitialisierte Ganzzahlen 2129993264 und nichtinialisierte Objekte nur ungültige Zeiger (d. H. Nicht null). Ich vermute, die Norm ist es, immer Variablen auf Prozedurebene zu setzen, bevor Sie darauf zugreifen?

98
MB.

Ja, dies ist das dokumentierte Verhalten:

  • Objektfelder werden immer mit 0, 0.0, '', False, nil oder wie auch immer initialisiert.

  • Globale Variablen werden immer auch mit 0 usw. initialisiert.

  • Lokale referenzzählende * Variablen werden immer mit Null oder '' initialisiert.

  • Lokale nicht referenzierte * Variablen sind nicht initialisiert, daher müssen Sie einen Wert zuweisen, bevor Sie sie verwenden können.

Ich erinnere mich, dass Barry Kelly irgendwo eine Definition für "referenziert" geschrieben hat, diese aber nicht mehr finden kann, also sollte dies in der Zwischenzeit so sein:

referenziert == die selbst referenziert sind oder direkt oder indirekt Felder (für Datensätze) oder Elemente (für Arrays) enthalten, die referenziert sind wie: string, variant, interface oder dynamisches Array oder statisches Array , das solche Typen enthält.

Anmerkungen:

  • record selbst reicht nicht aus, um als Referenz gezählt zu werden
  • Ich habe dies mit Generika noch nicht ausprobiert
100

Globale Variablen ohne expliziten Initialisierer werden im BSS-Abschnitt der ausführbaren Datei zugewiesen. Sie belegen keinen Platz in der EXE-Datei. Der BSS-Abschnitt ist ein spezieller Abschnitt, den das Betriebssystem zuordnet und auf Null setzt. Auf anderen Betriebssystemen gibt es ähnliche Mechanismen.

Sie können sich darauf verlassen, dass globale Variablen mit Null initialisiert werden.

26
Barry Kelly

Klassenfelder sind standardmäßig Null. Dies ist dokumentiert, damit Sie sich darauf verlassen können. Lokale Stapelvariablen sind nicht definiert, es sei denn, Zeichenfolge oder Schnittstelle sind auf Null gesetzt.

20
Martin Liesén

Nur als Randnotiz (wie Sie neu in Delphi sind): Globale Variablen können direkt beim Deklarieren initialisiert werden:

var myGlobal:integer=99;
16

Hier ist ein Zitat von Ray Lischners Delphi in Kürze Kapitel 2

"Wenn Delphi zum ersten Mal ein Objekt erstellt, beginnen alle Felder leer, dh Zeiger werden auf Null initialisiert, Zeichenfolgen und dynamische Arrays sind leer, Zahlen haben den Wert Null, Boolesche Felder sind Falsch und Varianten werden auf Nicht zugewiesen gesetzt. (Weitere Informationen finden Sie unter NewInstance und InitInstance in Kapitel 5.)

Es ist wahr, dass lokale Variablen initialisiert werden müssen ... Ich würde den obigen Kommentar, dass "Globale Variablen initialisiert werden", als zweifelhaft betrachten, bis sie mit einer Referenz versehen werden - das glaube ich nicht.

edit ... Barry Kelly sagt, dass man sich darauf verlassen kann, dass sie auf Null gesetzt werden, und da er im Delphi-Compiler-Team ist, glaube ich, dass das stimmt :) Danke Barry.

8
Drew Gibson

Globale Variablen und Objektinstanzdaten (Felder) werden immer auf Null initialisiert. Lokale Variablen in Prozeduren und Methoden werden in Win32 Delphi nicht initialisiert. Ihr Inhalt ist undefiniert, bis Sie ihnen einen Wert im Code zuweisen.

6
Ondrej Kelle

In der Delphi 2007-Hilfedatei:

ms-help: //borland.bds5/devcommon/variables_xml.html

"Wenn Sie eine globale Variable nicht explizit initialisieren, initialisiert der Compiler sie auf 0."

4
Ondrej Kelle

Selbst wenn eine Sprache Standardinitialisierungen bietet, sollten Sie sich meiner Meinung nach nicht darauf verlassen. Das Initialisieren auf einen Wert macht es anderen Entwicklern, die möglicherweise nichts über Standardinitialisierungen in der Sprache wissen, klarer und verhindert Probleme zwischen Compilern.

4
Thomas Owens

Ich habe eine kleine Beschwerde mit den gegebenen Antworten. Delphi löscht den Speicherplatz der Globals und der neu erstellten Objekte. Während dies NORMALERWEISE bedeutet, dass sie initialisiert werden, gibt es einen Fall, in dem dies nicht der Fall ist: Aufzählungstypen mit bestimmten Werten. Was ist, wenn Null kein legaler Wert ist?

3
Loren Pechtel