![]() |
Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Hallo Community,
ich erzeuge zur Laufzeit eine spezielle zweidimensionale dynamische Struktur: Eine dreieckige Matrix gemäß nachfolgendem Demo-Programm. Die Dreieckmatrix wird von der Procedure
Delphi-Quellcode:
erzeugt. Die Procedure
Make_3EckMatrix(..)
Delphi-Quellcode:
hilft Euch bei der simplen Visualisierung dieser Struktur.
PrintMatrixX(..)
Delphi-Quellcode:
Meine Frage:
program _3Eck_Matrix_2;
{$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; Type TDynExtendedVektor = TArray<Extended>; // = Array of Extended; TMatrix = Array of TDynExtendedVektor; Procedure PrintMatrixX(CONST Matrix: TMatrix; Name: String); Overload; // Nur zum Debuggen VAR Zeile, Spalte, n_Zeilen, n_Spalten: Integer; CONST Leer = ' '; Pad = 6; Begin WriteLn; WriteLn(Name + '[', Low(Matrix), '..', High(Matrix), ' ; ', Low(Matrix[0]), '..', High(Matrix[0]), ']'); WriteLn('--------------------------'); n_Zeilen:= Length(Matrix); For Zeile:= 0 To n_Zeilen - 1 Do Begin n_Spalten:= Length(Matrix[Zeile]); For Spalte:= 0 To n_Spalten - 1 Do Begin Write(Matrix[Zeile, Spalte].ToString.PadLeft(Pad)); Write(Leer); End; WriteLn; End; WriteLn('--------------------------'); WriteLn; End;{PrintMatrixX} {----------------} Procedure Make_3EckMatrix(VAR DreiEckMatrix: TMatrix; n_Spalten_Max: Integer); // Dynamische DreiEckMatrix dimensionieren VAR Zeile : Integer; Spalten: Integer; Begin SetLength(DreiEckMatrix, N_Spalten_Max, 0); // Zunächst NUR einen Vektor anlegen Spalten:= N_Spalten_Max; For Zeile:= Low(DreiEckMatrix) To High(DreiEckMatrix) Do Begin SetLength(DreiEckMatrix[Zeile], Spalten); Dec(Spalten); End; End;{Make_3EckMatrix} {-------------------} VAR n_Spalten_Max: Integer; DreiEckMatrix: TMatrix; Begin ReportMemoryLeaksOnShutdown:= True; Try Try n_Spalten_Max:= 10; WriteLn('n_Spalten_Max = ', n_Spalten_Max); Make_3EckMatrix(DreiEckMatrix, n_Spalten_Max); PrintMatrixX(DreiEckMatrix, 'DreiEckMatrix'); ReadLn; Finally // DreiEckMatrix:= NIL; // Nicht nötig? Wird anscheinend automatisch freigegeben? End; Except On E: Exception Do Writeln(E.ClassName, ': ', E.Message); End; End. Wieso meldet weder
Delphi-Quellcode:
noch madExcept einen Speicherleck, wenn ich die dynamische Struktur gar nicht freigebe?
ReportMemoryLeaksOnShutdown:= True;
Vorsichtshalber habe ich ein
Delphi-Quellcode:
im Finally-Block hinzugefügt, frage ich mich jedoch, ob nicht eine Speicher-Freigabe analog zum Anlegen via
DreiEckMatrix:= NIL;
Delphi-Quellcode:
per For-Schliefe notwendig wäre.
Make_3EckMatrix(..)
Weiß jemand eine Antwort? Danke im Voraus! Viele Grüße Andreas |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Dynamische Arrays werden bei Verlassen des Scopes automatisch freigegeben.
|
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Also wenn ich's richtig sehe ist da nirgends ein Create in deinem Code, oder?
Dann wird auch kein Objekt irgendwo erzeugt und damit gibt's auch kein Speicherleck weil du dann nur einen dynamischen Array erzeugst und der wird ja automatisch verwaltet. |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Ich habe es - noch zu Zeiten von Delphi 5 so gelernt - und dies seither auch stets so gehandhabt, daß jedes mit
Delphi-Quellcode:
erzeugte dynamische Array am Ende mit
SetLegth(My_Array, Len)
Delphi-Quellcode:
freigegeben werden muß.
My_Array:= NIL;
Von diesem (für mich neuen) Comfort habe ich bis jetzt nichts mitbekommen...:oops: Danke! Grüße, Andreas |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Zitat:
|
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
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. :oops: Danke Euch allen! Viele Grüße Andreas |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
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... |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
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 ![]() |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
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. ![]() |
AW: Warum wird eine dynamisch erzeugte Matrix scheinbar automatisch freigegeben?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:19 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