AGB  ·  Datenschutz  ·  Impressum  







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

Speicherverwaltung bei Basisdatentypen

Ein Thema von Getox · begonnen am 13. Mär 2019 · letzter Beitrag vom 13. Mär 2019
Antwort Antwort
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Speicherverwaltung bei Basisdatentypen

  Alt 13. Mär 2019, 09:43
Lokale Variablen werden auf dem Stack abgelegt. Die werden sobald die Funktion verlassen wird (wie du sagtest) ungültig, bzw. der Speicher wird früher oder später durch lokale Variablen oder Rücksprungadressen anderer Funktionen überschrieben.
Variablen von Objekten liegen einfach im für das Objekt reservierten Speicherbereich. Wenn das Objekt freigegeben wird, werden damit auch die Variablen des Objekts freigeben bzw. liegen in ungültigem/nicht reserviertem Speicher.
Bei globalen Variablen bin ich mir nicht zu 100% sicher, aber ich denke für die wird schon beim Laden der .exe Speicher reserviert und der wird auch erst wieder freigegeben wenn die .exe (bzw. das entprechende Modul) beendet/entladen wird.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Speicherverwaltung bei Basisdatentypen

  Alt 13. Mär 2019, 11:08
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...
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Schokohase
(Gast)

n/a Beiträge
 
#3

AW: Speicherverwaltung bei Basisdatentypen

  Alt 13. Mär 2019, 11:11
Ein string ist auch ein Referenz-Typ, allerdings zusätzlich mit einem Referenz-Zähler. Und wenn der Referenz-Zähler auf 0 geht, dann wird der Bereich auf dem Heap automatisch freigegeben.
  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 08:11 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