Hallo Nogge,
wenn SetLength(v, 0) zuerst ausgeführt wird, dann kommt Finalize(v, Length(v)) doch nach der Feier.
Delphi-Quellcode:
type
TItem = packed record
Name: string;
Amount: integer;
end;
var
Items: array of TItem;
i: integer;
begin
// es werden 3 mal 8 Byte vom heap besorgt
SetLength(Items, 3);
// die einzelnen Items werden initialisert
for i := Low(Items) to High(Items) do
with Items[i] do
begin
// der pointer "Name" wird auf einen dynamischen
// Speicherblock gesetzt, der 6 Byte Nutzdaten zzgl.
// Verwaltungsinformationen (Längenzähler, term char, etc.
// umfasst.
Name := 'Name-' + IntToStr(Succ(i));
// nativer Datentyp, kein heap beteiligt
Amount := Succ(Random(5));
end;
end;
// Alle Zeiger "Name" werden auf nil gesetzt
// der garbage collector beobachtet den auf
// 0 gehenden refence count und deallokiert
// den von den strings auf dem heap belegten Speicher
Finalize(Items, Length(Items));
// Die 3 * 8 Byte müssen auch noch an den heap
// zurückgegeben werden.
SetLength(Items, 0);
end;
Sonntagsgrüße vom marabu