Thema: Delphi Array korrekt freigeben

Einzelnen Beitrag anzeigen

Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.499 Beiträge
 
Delphi 12 Athens
 
#32

AW: Array korrekt freigeben

  Alt Gestern, 07:59
Du hast Recht, ich habe mich geirrt, beide Compiler erzeugen das selbe Ergebnis.

Variablen von managed Types werden durch Finalize() auf nil gesetzt.
Andere Variablen behalten den vorherigen Inhalt.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
  TMyRecord = record
    A: Integer;
    B: String;
    C: IInterface;
    D: array of String;
    E: array[0..2] of Char;
    procedure Clear;
    procedure Ausgabe;
  end;

procedure TMyRecord.Clear;
begin
  Finalize(Self); // für Strings, Interfaces, Array usw.
  FillChar(Self, SizeOf(Self), 0);
end;

procedure TMyRecord.Ausgabe;
begin
  Writeln('A: Integer Value: ', IntToStr(A));
  Writeln('B: String Value: "', B, '"');
  Writeln('C: IInterface Assigned: ', Assigned(C));
  Writeln('D: array of String Assigned: ', Assigned(D));
  Writeln('E: array[0..2] of Char Value: ["', E[0], '", "', E[1], '", "', E[2], '"]');
end;

var
  m1, m2: TMyRecord;
begin
  try
    m1.A := 100;
    m1.B := IntToStr(m1.a);
    m1.C := TInterfacedObject.Create;
    SetLength(m1.D, 3);
    m1.D[0] := 'A';
    m1.D[1] := 'B';
    m1.D[2] := 'C';
    m1.E[0] := 'A';
    m1.E[1] := 'B';
    m1.E[2] := 'C';

    m2 := m1;

    m1.Ausgabe;

    Writeln;
    Writeln('Finalize(m1)');
    Finalize(m1);
    Writeln;

    m1.Ausgabe;

    readln;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.
ausgabe.png
  Mit Zitat antworten Zitat