Danke. Durch das Stichwort "Stack" habe ich mich erinnert, dass mir mein Ausbilder damals Etwas über Heap und Stack erklärt hat. Danach habe ich mal jetzt gesucht und habe folgenden Thread gefunden:
https://www.delphipraxis.net/162461-...erschiede.html
Das hat mich mit meinem Verständnis auf jeden Fall noch einmal ein ganzen Stück vorran gebracht.
Was ich jetzt verstanden habe:
Lokale Variablen landen auf dem Stack. Dort wird jeweils ein "Slot" mit einer bestimmten Größe reserviert. Bei einer Variable mit einer festen Größe wie z.B. Integer wird der reservierte Speicher wieder Freigegeben, wenn die Funktion verlassen wird und die Variable wieder vom Stack entfernt wird.
Bei einem Objekt passiert das selbe mit der Referenz auf das Objekt. Das Objekt liegt auf dem Heap und die Variable auf dem Stack zeigt auf die Heap-Adresse des Objektes. Wenn ich dieses nicht manuell freigebe, wird die Referenz beim verlassen der Funktion freigegeben und das Objekt liegt ohne Referenz unauffindbar im Heapspeicher.
Anderes Szenario: Ich habe eine lokale Variable für eine Objektreferenz. Diese übergebe ich als Parameter an eine weitere Funktion, in der ich das Objekt freigebe. Wenn ich nun in die ursprüngliche Funktion zurückkehre, habe ich dort noch die Referenz in der lokalen Variable gespeichert, die aber nun an einen Ort im Heap zeigt, wo überhaupt kein Objekt mehr liegt.
Was ich jetzt noch nicht verstehe:
Wie ist das bei Strings? Diese sind doch variabel ihrer Größe, also müssten sie doch theoretisch eher auf dem Heap landen, oder? Aber warum muss ich Strings dann nicht manuell erstellen und freigeben? Ich hatte auch schon mal ein Leak durch einen String in einem Record, den ich erstmal wieder leeren musste. Aber ich setze ja auch nicht jedesmal jeden String wieder auf '', bevor eine Funktion verlassen wird...