AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Verfügbarkeit von Objecten in unterschiedlichen Units
Thema durchsuchen
Ansicht
Themen-Optionen

Verfügbarkeit von Objecten in unterschiedlichen Units

Ein Thema von Ykcim · begonnen am 24. Feb 2025 · letzter Beitrag vom 25. Feb 2025
Antwort Antwort
berens

Registriert seit: 3. Sep 2004
441 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Verfügbarkeit von Objecten in unterschiedlichen Units

  Alt 25. Feb 2025, 09:47
Der initialization Teil ist in meinen Augen Sinnlos, korrigiert mich bitte wenn ich Falsch liege
Hier wird kein Create durchgeführt sondern ein Nil Pointer auf ein Objekt gesetzt, dass es eigentlich noch nicht geben dürfte. Es sei den, du erzeugst das Objekt direkt beim Programmstart (Quelltext des Projekts selbst und nicht in der Unit). Selbst dann müsste es aber "leer" sein.
Moin,
tja, ich leide an Fehler-Paranoia

Tatsache ist, das es für mich sehr "diffus" ist, wann/ob Delphi Variablen richtig initialisiert. Der Arbeitsspeicher (RAM) deines Computers wird ja wiederverwendet: Wenn du ein Programm zumachst, wir der Arbeitsspeicher frei, in dem Sinne von "Keine Referenz zeigt mehr darauf", aber der RAM wird -meines Wissens(!) nicht "Formatiert", so dass nach Programmende der komplette Arbeitsspeicher auf 0000000 steht, sondern es bleibt zunächst mal alles so wie es gerade ist. Wenn du nun in Delphi neue Variablen und Objekte hast, die einen Zeiger auf den Arbeitsspeicher bekommen mit "den darfst du benutzen, da arbeitet aktuell niemand mit", bedeutet das nicht, dass nun der komplette Arbeitsspeicher auf 0 gesetzt wird, sondern dass dort immernoch ein Buchstabensalat stehen *könnte*, und somit in einer brandneuen, uninitialisierten integer Variable der Wert 17 steht, in einem String "adfkgjzudfdui", und in bei einem Zeiger auf ein Objekt dieses bei Assigned(MeinObjekt)=True zurück geben könnte.

Wie gesagt, das ist nur die Paranoia. In der Delphi Hilfe finde ich bei den einzelnen Datentypen (Integer, TComponent, String, ...) NICHT, *ob* die Variablen immer initilaisiert werden (string='' integer=0 TMeinObjekt=NIL) und wenn ja, mit welchem Wert.

Damit ich nicht böse überrascht werde, oder in einer neuen Delphi Version auf einmal alles gehandhabt wird (Hey, deine widestring-variable ist nun beim Programmstart nicht mehr '' sonder NIL!) initialisiere ich lieber 100x unnötig alles per Hand, kann dann aber sicher sein, dass alles wirklich so ist, wie erwartet.

Also: Ja, beim Programmstart wird die MeinObjekt (unnötig) auf NIL gesetzt - damit stelle ich sicher, dass assigned() in der entsprechenden Methode auch wirklich 100% sicher sagen kann, ob das Objekt *gültig* existiert, oder nicht. Wie gesagt, assigned(MeinObjekt) könnte(?) evtl. true bei sein, obwohl ich noch kein Objekt erzeugt habe. Die Funktion erzeugt dann das gültige Objekt und gibt es zurück.

Ja, wahrscheinlich alles komplett übertrieben und unnötig, aber ich habe mit Delphi einfach schon viel zu viel Bulls*** erlebt, als dass mich sowas noch wundern würde.

Zeigt mir gerne wo steht, dass *ALLE* Variablen und Objekte stets mit 100% Zuverlässigkeit mit NIL, 0 oder "" initialisiert werden.
--> Danke für den Link, ich hatte bei "Integer" und "Einfache Typen" gesucht, aber bei "Variablen" war zu einfach . Tatsächlich trifft das aber dennoch nur auf globale, nicht auf lokale Variablen zu.

ChatGPT sagt dazu:
Zitat:
In Delphi werden globale Variablen und Felder von Objekten (also Klasseninstanzvariablen) automatisch mit nil initialisiert. Lokale Variablen, wie in deinem Beispiel die Variable b in der Prozedur, werden dagegen nicht automatisch auf nil gesetzt, wenn du sie nicht explizit initialisierst. Das bedeutet:

Globale Variablen und Klassenfelder: Immer nil, wenn sie noch keinen gültigen Wert erhalten haben.
Lokale Variablen (in Prozeduren/Funktionen): Können uninitialisiert sein und daher zufällige (Garbage‑)Werte enthalten, die nicht nil sind.

Die offizielle Embarcadero-Dokumentation zum Verhalten der Funktion Assigned und der Speicherinitialisierung bestätigt, dass nur Variablen, die explizit initialisiert wurden (oder als globale/Membervariablen deklariert sind), sicher den Wert nil besitzen. Wird eine lokale Variable nicht initialisiert, kann ein zufälliger Speicherwert vorliegen, wodurch Assigned(b) unter Umständen true zurückgeben kann.
Leider hat das der Link gefehlt.

Okay, also globale Variablen und Objekte scheinen das Problem nicht zuhaben, lokale schon. Was soll das denn bitte?
Gut, mein initialisieren ist unnötig, aber ich kotze im Strahl mit den 1000 Sonderfällen und Ausnahmeregelungen in Delphi wann was geht oder nicht geht, oder wann was automatisch passier und wann nicht. So ist es mehr Tipp-Arbeit und unnötig, aber zumindest ist damit meine Speicherverwaltung konsistent für lokale und globale Variablen.

Ich hätte Schreiner werden sollen...
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit

Geändert von berens (25. Feb 2025 um 10:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#2

AW: Verfügbarkeit von Objecten in unterschiedlichen Units

  Alt 25. Feb 2025, 10:01
Man kann globale Variablen auch gleich bei der Deklaration initialisieren:
Delphi-Quellcode:
var
  FMeinObjekt: TMeinObjekt = nil;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#3

AW: Verfügbarkeit von Objecten in unterschiedlichen Units

  Alt 25. Feb 2025, 10:27
Zeigt mir gerne wo steht, dass *ALLE* Variablen und Objekte stets mit 100% Zuverlässigkeit mit NIL, 0 oder "" initialisiert werden.
Das ist eindeutig dokumentiert:
https://docwiki.embarcadero.com/RADS...ables_(Delphi)
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.

When you declare a variable, you are allocating memory which is freed automatically when the variable is no longer used. In particular, local variables exist only until the program exits from the function or procedure in which they are declared.
Anders sieht es bei referenzgezählten Datentypen aus (strings, Interfaces, ...). Die werden auch lokal mit 0 initialisiert, was einfach daran liegt, dass ansonsten bei der ersten Zuweisung versucht würde, den alten Speicher freizugeben (obwohl der Wert gar nicht gültig wäre).
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
fisipjm

Registriert seit: 28. Okt 2013
334 Beiträge
 
Delphi 12 Athens
 
#4

AW: Verfügbarkeit von Objecten in unterschiedlichen Units

  Alt 25. Feb 2025, 10:31
Tatsache ist, das es für mich sehr "diffus" ist,
Hier gibt's eine gute Übersicht wie was wo im Standard initialisiert wird.
https://stackoverflow.com/questions/...lue-by-default

Auch immer gut in der Entwicklung wenn du schon beim Thema Speichermanagement bist, ReportMemoryLeaksOnShutdown := true in den Programmstart packen. Falls du das noch nicht kanntest bzw. hast
https://docwiki.embarcadero.com/Libr...eaksOnShutdown
  Mit Zitat antworten Zitat
Antwort Antwort


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 13:14 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