AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Thema durchsuchen
Ansicht
Themen-Optionen

Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

Ein Thema von Andreas13 · begonnen am 27. Mai 2022 · letzter Beitrag vom 30. Mai 2022
Antwort Antwort
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.734 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 27. Mai 2022, 17:45
Ich habe es - noch zu Zeiten von Delphi 5 so gelernt - und dies seither auch stets so gehandhabt, daß jedes mit SetLegth(My_Array, Len) erzeugte dynamische Array am Ende mit My_Array:= NIL; freigegeben werden muß.
Ich erinnere mich nicht, dass das bei Delphi 5 notwendig gewesen wäre. Das mag aber meinem schlechten Gedächtnis geschuldet sein. Ich könnte ja jetzt mein Notebook mit der Delphi 5 Installation rauskramen...
Thomas Mueller
  Mit Zitat antworten Zitat
Andreas13

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

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 27. Mai 2022, 19:39
Hallo Thomas,
Du magst recht haben. Allerdings konnte ich nach einigem Suchen herausfinden, wo ich das gelernt habe: In einem von mir hochgeschätzten und vielbenutzen Buch:
Doberenz + Gewinnus: Borland Delphi 7: Grundlagen Profiwissen, 2003. S. 93/94.
Bis jetzt hat es meine Programme nicht gestört, wahrscheinlich war es aber, wie Ihr alle schreibt, überflüssig.
Man(n) lernt ja bekanntlich nie aus.
Danke Euch allen!

Viele Grüße
Andreas
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
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.094 Beiträge
 
Delphi 12 Athens
 
#3

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 27. Mai 2022, 20:25
Naja, der Code für den Multimedia Timer dieser beiden Herren ist jedenfalls etwas fehlerhaft und nicht wie gezeigt lauffähig...

Soviel zur Schätzung
Aber ja, es gibt schlechtere Bücher...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 27. Mai 2022, 21:46
Managed Typen verwaltet Delphi automatisch, also Speicherfreigabe und deswegen auch immer eine autmatische Initialisierung der Variable mit 0 (nil).

Interfaces
Variants
dynamische Arrays
LongStrings (alle Strings außer ShortString, aber der ist ein statisches Array und somit auch automatisch weg)
und neuerdings auch Custom Managed Records (wenn man Initialize und Finalize implementiert hat)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.079 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 30. Mai 2022, 08:24
Bevor du das Rad neu erfindest, schau dir doch auch die Unit System.Math.Vectors an.
Vielleicht ist da was dabei, was du gebrauchen kannst.
Gibt es meines Wissens nach ab Delphi Seattle aufwärts.

https://docwiki.embarcadero.com/Libr...m.Math.Vectors
  Mit Zitat antworten Zitat
Andreas13

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

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 30. Mai 2022, 14:33
Ich habe es - noch zu Zeiten von Delphi 5 so gelernt - und dies seither auch stets so gehandhabt, daß jedes mit SetLegth(My_Array, Len) erzeugte dynamische Array am Ende mit My_Array:= NIL; freigegeben werden muß.
Ich erinnere mich nicht, dass das bei Delphi 5 notwendig gewesen wäre...
Habe gerade in meiner lokalen Hilfe-Datei zu XE5 (Stand ca. 2013) folgenden Hinweis gefunden: ms-help://embarcadero.rs_xe5/rad/Strukturierte_Typen.html
Zitat:
Dynamische Array-Variablen sind implizit Zeiger und werden mit derselben Referenzzählung verwaltet wie lange Strings. Um ein dynamisches Array freizugeben, weisen Sie einer Variable, die das Array referenziert, den Wert nil zu, oder Sie übergeben die Variable an Finalize. Beide Methoden geben das Array unter der Voraussetzung frei, dass keine weiteren Referenzen darauf vorhanden sind. Dynamische Arrays werden immer freigegeben, sobald ihr Referenzzähler null ist. Dynamische Arrays der Länge 0 haben immer den Wert nil.
Leider wird nirgends aufgeführt, welche Typen "gemanagt" sind und somit automatisch freigegeben werden.
Grüße, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)

Geändert von Andreas13 (30. Mai 2022 um 14:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 30. Mai 2022, 14:48
Man kann alles an Finalize übergeben ... am Ende des Scopes (z.B. im END; von Funktionen wird Dieses aufgerufen, in einem implizitem Try-Finally, sobald gemanagte lokale Variablen vorhanden sind)

Was:
Zitat:
Strings/Interfaces/Objekten/Variants/DynArrays
zzgl. CustomManagedRecords

genauer LongStrings (alle Delphi-Strings, außer ShortString und WideString) sind wie aufgemotzte dynamische Arrays.
Der WideString ist sogar "eigentlich" eine gekapselte WinAPI für einen BSTR / OLE-String (siehe MSDN-Library durchsuchenSysAllocString).
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.734 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 30. Mai 2022, 18:12
Ich habe es - noch zu Zeiten von Delphi 5 so gelernt - und dies seither auch stets so gehandhabt, daß jedes mit SetLegth(My_Array, Len) erzeugte dynamische Array am Ende mit My_Array:= NIL; freigegeben werden muß.
Ich erinnere mich nicht, dass das bei Delphi 5 notwendig gewesen wäre...
Habe gerade in meiner lokalen Hilfe-Datei zu XE5 (Stand ca. 2013) folgenden Hinweis gefunden: ms-help://embarcadero.rs_xe5/rad/Strukturierte_Typen.html
Eben: Man kann ein dynamisches Array explizt freigeben aber man muss das nicht tun. Abgesehen davon ging es doch um Delphi 5 (released 1999, ), nicht Delphi XE5 (released 2013), oder nicht?
Thomas Mueller
  Mit Zitat antworten Zitat
Andreas13

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

AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?

  Alt 30. Mai 2022, 19:47
Hi Thomas,
damit wollte ich nur sagen, daß die eingebaute Delphi-Hilfe selbst bei XE5 (Stand: 2013) immer noch nicht von einer automatischen Freigabe ("managed Type") spricht, sondern nur von Nil oder Finalize zur Freigabe des Speichers.
Was mich gewundert hat, war, daß wenn ich weder Nil noch Finalize benutze, das dynamische Array trotzdem freigegeben wird.
Grüße, Andreas
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 17:37 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