Hallo Community,
ich erzeuge zur Laufzeit eine spezielle zweidimensionale
dynamische Struktur: Eine dreieckige Matrix gemäß nachfolgendem Demo-Programm. Die Dreieckmatrix wird von der Procedure
Make_3EckMatrix(..)
erzeugt. Die Procedure
PrintMatrixX(..)
hilft Euch bei der simplen Visualisierung dieser Struktur.
Delphi-Quellcode:
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.
Meine Frage:
Wieso meldet weder
ReportMemoryLeaksOnShutdown:= True;
noch
madExcept einen Speicherleck, wenn ich die dynamische Struktur gar nicht freigebe?
Vorsichtshalber habe ich ein
DreiEckMatrix:= NIL;
im Finally-Block hinzugefügt, frage ich mich jedoch, ob nicht eine Speicher-Freigabe analog zum Anlegen via
Make_3EckMatrix(..)
per For-Schliefe notwendig wäre.
Weiß jemand eine Antwort?
Danke im Voraus!
Viele Grüße
Andreas