AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Packed record mit Dictionary als Variable, Richtig aufräumen
Thema durchsuchen
Ansicht
Themen-Optionen

Packed record mit Dictionary als Variable, Richtig aufräumen

Ein Thema von SusiT · begonnen am 15. Jan 2024 · letzter Beitrag vom 16. Jan 2024
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 02:49
:= Default(...) überschreibt einfach alles mit Nullen.
Von den Zeiger-Typen werden ausschließlich Managed-Typen automatisch freigegeben. (Variant, LongStrings, Interfaces und dynamische Arrays)
Also erst das Objekt freigeben und danach den Record leeren.

mögliche Lösungen
* Object anstatt Record
* Interface statt Object
* dynamisches Array anstatt Liste/Dictionary (mit dem generischen TArray.BinarySearch kann man es wie eine sortierte Liste behandeln -> Suchen, sowie für's Insert)
* Bei Google suchenCustom Managed Records
* ...

https://blogs.embarcadero.com/custom...o-delphi-10-4/
https://docwiki.embarcadero.com/RADS...anaged_Records
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 08:42
Wie schon gesagt, du musst das Dictionary explizit freigeben, sonst verbleibt es auf ewig im Speicher. Oder du stellst es auf einen Interface-Typ um, dann brauchst du dich darum nicht mehr kümmern.

Ob der record packed ist oder nicht ist hier eigentlich völlig egal.
  Mit Zitat antworten Zitat
SusiT

Registriert seit: 15. Mai 2014
40 Beiträge
 
#3

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 08:43
Habe ich verstanden, vielen Dank.

Ich nutze die packed records sehr gerne, da diese sich recht leicht erstellen und verwalten lassen.

Grundsätzlich ist es aber möglich, dass komplexere Speicherstrukturen in einem packed record enthalten sind nehme ich an? (Wie zb. Dictionarys)

Ohne das irgendwelche komischen Sachen passieren


Viele Grüße
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 09:13
Ein TDictionary ist an sich nicht komplex, das ist ja nur ein "Zeiger" auf einen Bereich anderswo, außerhalb des Records. Eben deshalb musst du das Dictionary explizit wieder freigeben.

Es gibt noch Typen bei denen der Compiler (bzw. die automatische Referenzzählung "ARC") sich darum kümmert, den Speicher wieder freizugeben. Das ist beispielsweise der Fall bei Strings, oder dynamischen Arrays. Da musst du dich auch nicht drum kümmern. Würdest du ein für dich passendes Interface um dein TDictionary basteln und dann ein IDictionary verwenden, müsstest du dich um die Freigabe auch nicht mehr kümmern 😊


Meine Frage wäre noch, weshalb das packed ? Bist du dir sicher, dass du das brauchst? Ich kenne das eigentlich nur, wenn du eine Struktur 1:1 serialisieren willst (z.B. für Netzwerk-Übertragung oder Speichern in eine Datei), aber das kann man sich eh schenken wenn du zeigerbasierte Typen (wie z.B. ein Dictionary) drin hast.

packed macht den Speicherzugriff auf Teile des Records nur langsamer, weil verhindert wird, dass (für dich unsichtbare) Lücken zwischen den Feldern des Records gepackt werden, damit der Computer für ihn besser den Speicher da rauslesen kann.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 09:43
Ich nutze die packed records sehr gerne, da diese sich recht leicht erstellen und verwalten lassen.
Das hat aber nichts mit Packed zu tun.

So lange es nicht auf jedes einzelne Byte drauf an kommt oder der Record für Speicherung oder Datenübertragung (in andere Systeme/Programme/...) verwendet wird, kann es aber nachteile bringen, wenn Speicher ungünstig ausgerichtet ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#6

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 09:53
... Also erst das Objekt freigeben und danach den Record leeren....
Das verstehe ich nicht ganz... Sollte die Reihenfolge nicht anders sein?
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.912 Beiträge
 
Delphi 12 Athens
 
#7

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 10:17
... Also erst das Objekt freigeben und danach den Record leeren....
Das verstehe ich nicht ganz... Sollte die Reihenfolge nicht anders sein?
Nein, das Leben des Records wird durch Überschreiben mit Nullwerten realisiert. Damit würde mann auch den Zeiger überschreiben, der zum Löschen des Objektes benötigt wird.
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
730 Beiträge
 
Delphi XE5 Professional
 
#8

AW: Packed record mit Dictionary als Variable, Richtig aufräumen

  Alt 16. Jan 2024, 10:24
Danke, jetzt habe ich das verstanden!
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  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 09:32 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