Ich habe ein Verständnisproblem bei der Speicherfreigabe mit Dispose.
Ich habe mir einen Ringspeicher zur Aufnahme von Messdaten auf Basis eines TList definiert.
Vor dem Hinzufügen eines neuen Elements wird zunächst geprüft, ob die Maximalgröße des Buffers erreicht ist und gegebenenfalls das älteste Element (also das erste in der Liste gelöscht).
Im Code sieht das etwa so aus:
Code:
Buffer: TList;
procedure AddRecord(ARecord: TDataRecord);
var
P: PDataRecord;
begin
New(P);
P^.Values := Copy(ARecord.Values);
if Buffer.Count = fMaxBufSize then begin
Dispose(Buffer.Items[0]);
Buffer.Delete(0);
end;
Buffer.Add(P);
end;
Hierbei wird aber durch Dispose der Speicherplatz des Elements Buffer.Items[0] nicht freigegeben!
Erst wenn ich den Code wie folgt umschreibe, funktioniert es:
Code:
procedure AddRecord(ARecord: TDataRecord);
var
P, P2: PDataRecord;
begin
New(P);
P^.Values := Copy(ARecord.Values);
if Buffer.Count = fMaxBufSize then begin
P2 := Buffer.Items[0];
Dispose(P2);
Buffer.Delete(0);
end;
Buffer.Add(P);
end;
Kann mir jemand den Unterschied erklären?
Das Problem führte bei mir nach einigen Wochen Programmlaufzeit zu einem Speicherfehler und war daher sehr schwer zu lokalisieren.