Einzelnen Beitrag anzeigen

JRadke

Registriert seit: 23. Feb 2006
Ort: Hamburg
17 Beiträge
 
#1

Speicherfreigabe mit Dispose

  Alt 9. Dez 2017, 18:21
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.
  Mit Zitat antworten Zitat