Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: komisches Verhalten mit OleVariant

  Alt 23. Jul 2022, 00:03
Das ist/war eine Optimierung. gesparte Zeit, wenn nicht ständig im Speicher rumgeschrieben wird (Initialisierung bei Funktionsstart).

Aber mal ganz im Ernst, warum hörst du nicht auf deinen Compiler, welcher dir gesagt haben sollte, dass diese Variable nicht initialisiert ist?



PS: Result wird auch nicht initialisiert.
Hier hast du sogar einen bösen sonderfall, weil es ein String (gemangter Typ) ist.
Nur mit dem Problem, dass das Result (dieser String) nicht dort initialisiert wird, wo du vielleicht denkst.
Hier nicht beim Aufruf der Funktion, sondern beim Aufrufer der Funktion, wo der Speicher für "dieses" Result her kommt. (bei gemagten Typen)



Globale Variablen liegen auf dem Heap, in einem Speicherbereich, welche von Windows bereitgestellt wird, wenn das Modul (EXE oder DLL) geladen wird.
Ebenso sieht es mit Thread-Variablen aus, wo der Speicherbereich beim erstellen des Threads bereitgestellt wird.

Speicher von Windows, ebenso wie aus VirtualAlloc, wird immer mit 0 initalisiert.



Lokale Variablen liegen aber auf dem Stack, welcher zwar zu Beginn (Program/Thread) zwar auch 0 ist, aber dort wird nie gelöscht
und bei Funktionseintritt auch nicht von Delphi neu geleert.
Außnahme sind gemanagte Typen, wie Variant, Interface, String, dynamische Arrays und neuerdings (bedingt) auch Managed Custom Records.
Grund ist die automatische Speicherverwaltung, welche nur funktionieren kann, wenn es einen definierten Zustand gibt.
$2B or not $2B

Geändert von himitsu (23. Jul 2022 um 00:08 Uhr)
  Mit Zitat antworten Zitat