AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array korrekt freigeben

Ein Thema von woodie · begonnen am 23. Sep 2025 · letzter Beitrag vom 29. Sep 2025
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von Stevie
Stevie

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

AW: Array korrekt freigeben

  Alt Gestern, 01:15
Selbst die Integer-Variable wird auf 0 gesetzt.
Auf keinen Fall - in Delphi 12 führt Finalize direkt zu einem Aufruf von _FinalizeRecord und die Routine behandelt nur managed typekinds.

Ich habe die im Rahmen von https://quality.embarcadero.com/browse/RSP-35078 selbst refactored, deshalb weiß ich das sehr genau. Das Verhalten war vorher auch schon genauso.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
EKON 29
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
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz