Thema: Delphi Array korrekt freigeben

Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.058 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#7

AW: Array korrekt freigeben

  Alt Heute, 09:35
Mit Finalize muss man sehr vorsichtig sein, sonst erzeugt man an anderer Stelle eine Zugriffsverletzung.
Delphi-Quellcode:
type
  TMyRecord = record
    A: Integer;
    B: String;
    C: IInterface;
    procedure Clear;
  end;

implementation

procedure TMyRecord.Clear;
begin
  Finalize(Self); // für Strings, Interfaces, Array usw.
  FillChar(Self, SizeOf(Self), 0);
end;
Finalize prüft ob B und C auf Nil verweisen.
Ist das nicht der Fall, wird der Referenzzähler des Strings oder Objects verringert.
Fällt der Referenzzähler auf 0 wird der String oder das Object freigegeben, der Inhalt der Variablen aber nicht verändert.
Durch FillChar verweisen B und C danach auf Nil.
Falsch, auch Finalize setzt die Felder von managed Types auf ihren "leer/nil" Status - denn genau dadurch wird der entsprechende Mechanismus hinter diesen Typen getriggert.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (Heute um 09:38 Uhr)
  Mit Zitat antworten Zitat