AGB  ·  Datenschutz  ·  Impressum  







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

Array of Record & Speicher Freigaben

Ein Thema von Real_Thunder · begonnen am 13. Aug 2006 · letzter Beitrag vom 14. Aug 2006
Antwort Antwort
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#1

Array of Record & Speicher Freigaben

  Alt 13. Aug 2006, 18:34
ICh habe ein Frage ur Speicherverwaltung von Delphi..

Und schwar erstelle ich ein Dynimisches Array of record.. bei dem u Laufeit
Elemente Hinzugefügt und gelöscht werden...

beim Löschen mache ich folgenes:
Der ArrayIndex der nachfolgenen elemente werden einfach einen Nach vorne gesetzt,
Und die Arrayänge um einen Verkürzt...

Da die Elemente ja nur Pointer sind, frage ich ob der speicher zu dem der Pointer zeigt auch freigegeben wird.

und wenn er nicht freigegeben wird... Wie kann ich ihn freigeben?

MfG Real Thunder
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Array of Record & Speicher Freigaben

  Alt 13. Aug 2006, 18:56
wenn es nur pointer sind und du speicher angefordert hast dann musst du ihn auch wieder frei geben.
Und wie du ihn freigibst hängt davon ab wie du ihn angefordert hast.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

Re: Array of Record & Speicher Freigaben

  Alt 13. Aug 2006, 19:02
Zitat von Real_Thunder:
[...]Dynimisches Array of record[...]
[...]Da die Elemente ja nur Pointer sind,[...]
Was denn nun? Wenn es wirklich Pointer sind, gilt, was SirThornberry gesagt hat.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Real_Thunder

Registriert seit: 25. Apr 2006
197 Beiträge
 
#4

Re: Array of Record & Speicher Freigaben

  Alt 13. Aug 2006, 19:48
Ich dachte mal gelesen zu haben, das der Inhalt eines Records nur Pointer sind, die auf den Eigenlichen Inhalt zeigen...

Naja.. wenn Das Programm soweit ist, werde ich es mal strapazieren, und den Speicherbedaft beobachten..
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#5

Re: Array of Record & Speicher Freigaben

  Alt 13. Aug 2006, 20:24
Zitat von Real_Thunder:
Ich dachte mal gelesen zu haben, das der Inhalt eines Records nur Pointer sind, die auf den Eigenlichen Inhalt zeigen...
Ich habe den Eindruck, dass hier nicht klar getrennt wird.

Ein Record hat eine feste Größe; das Programm (bzw. das Betriebssystem) weiß also zu jedem beliebigen Zeitpunkt genau, wieviel Speicher aktuell - nämlich nach der aktuellen Länge des Arrays - für das gesamte Array benötigt wird.

Anhängen oder Einfügen eines neuen Elements bedeutet also für Programm/BS: einen ausreichend großen Speicherplatz bereitstellen (meistens klappt das nicht durch einfaches Vergrößern des bisherigen Platzes); den bisherigen Inhalt umkopieren, das neue Element einfügen.

Entfernen eines Elements bedeutet analog: das Element herausholen; die anderen Elemente verschieben; den überzähligen Platz freigeben. Der Speicherplatz für dieses Element wird automatisch freigegeben, weil das Array entsprechend weniger Platz belegt (dadurch bleiben meist viele kleine Speicherblöcke übrig, die nicht mehr sinnvoll belegt werden können).

Dieses "ständige" Verändern des Speicherplatzes beschäftigt Programm/BS erheblich mehr als sinnvoll und nötig. Dies gilt vor allem dann, wenn (z.B. beim Programmstart) viele Records eingefügt werden.

Zur Vereinfachung kann man bessere Möglichkeiten nutzen, nämlich TObjectList, TArrayList o.ä. Diese Listen enthalten tatsächlich nur Zeiger auf die Elemente und können von vornherein auf eine bestimmte Länge (d.h. Anzahl von Elementen) vorbereitet werden. Dann gilt aber das, was SirThornberry und Khabarakh gesagt haben: Jeder Record bekommt an der Stelle, an der er angelegt wird, seinen Speicher zugewiesen. Wenn er in der Liste eingetragen wird, wird dort nur der Pointer eingetragen. Wenn er aus der Liste gestrichen wird, wird dort nur der Pointer entfernt; der Record existiert nach wie vor. Also muss er irgendwo seine Gültigkeit und seinen Speicher verlieren.

Das hat zwei gefährliche Nebeneffekte: Wenn der Record aus der Liste entfernt, aber nicht ausdrücklich gelöscht wird, bleibt sein Speicher blockiert. Wenn er gelöscht wird, weil sein Gültigkeitsbereich abläuft, steht der Pointer nach wie vor in der Liste und zeigt ins Nirwana!

Auch deshalb ist zu empfehlen, anstelle von Records möglichst nur noch Objekte zu verwenden; diese müssen immer ausdrücklich angelegt und entfernt werden. (Unter NET erledigt Letzteres der Garbage Collector und nimmt dem Programmierer diese Arbeit ab.)

Apropos Arbeit:
Zitat von Real_Thunder:
Naja.. wenn Das Programm soweit ist, werde ich es mal strapazieren, und den Speicherbedaft beobachten..
Viel besser ist es, von Anfang an konsequent nachzudenken und zu programmieren. Alles, was nachträglich geändert werden muss, führt zu doppelter und dreifacher Arbeit.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

Re: Array of Record & Speicher Freigaben

  Alt 14. Aug 2006, 07:49
Nachtrag (leider kann ich meinen vorigen Beitrag nicht mehr bearbeiten):

Zitat von Jürgen Thomas:
Ein Record hat eine feste Größe; das Programm (bzw. das Betriebssystem) weiß also zu jedem beliebigen Zeitpunkt genau, wieviel Speicher aktuell - nämlich nach der aktuellen Länge des Arrays - für das gesamte Array benötigt wird.
Das gilt so nicht, wenn der Record einen Delphi-String (variable Länge!) enthält. Das braucht uns eigentlich nicht weiter zu stören, weil Delphi alles, was dazu gehört, im Hintergrund erledigt. Dann gilt aber verstärkt, was ich im Abschnitt "Anhängen oder Einfügen eines neuen Elements" geschrieben habe.

Zitat von Jürgen Thomas:
Jeder Record bekommt an der Stelle, an der er angelegt wird, seinen Speicher zugewiesen...
Dies ist dann unproblematisch, wenn der Record ausschließlich innerhalb des Arrays verwendet wird. Dann wird außerhalb des Arrays kein Speicherplatz benötigt und reserviert (und muss also auch nicht freigegeben werden). Der Speicher für den Record wird dadurch angelegt, dass der Speicher des Arrays vergrößert wird; er wird dadurch freigegeben, dass der Speicher des Arrays verkleinert wird.

Jürgen
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Array of Record & Speicher Freigaben

  Alt 14. Aug 2006, 08:22
Wie Jürgen beschrieben hat, sind TObjectList (oder TArrayList) den klassischen arrays vorzuziehen... Und anstatt Records, einfach ein Objekt anlegen... Beim Löschen der TObjectList wird dann auch automatisch der Speicher der gespeicherten Objekte wieder 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 13:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz