Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.154 Beiträge
 
Delphi 12 Athens
 
#3

AW: Klassen: Clear -> Free -> Create?

  Alt 4. Okt 2020, 23:59
Self ist nur ein interner einfacher Parameter, der keine Referenz auf die externe Variable besitzt, daher ist das so nicht möglich.


Delphi-Quellcode:
procedure TCorona.VirusBeißtZu(Self: TCorona); // intern ist das Self
begin
  Self.Free;
  Self := TCorona.Create;
end;

//Corona.VirusBeißtZu;
TCorona.VirusBeißtZu(Corona);
Und "leider" ist es nicht möglich die Übergabe zu beeinflussen,
drum ist FreeAndNil auch eine Prozedur und kann micht ebenfalls als Methode implementiert werden, so wie das Free.

Man könnte jetzt in das Speichermanagement eingreifen und nach dem Free das neue Objekt an der "selben" Speicheradresse erzeugen.
Da dann beide Objekte an der selben Stelle liegen, zeigt die externe Variable immernoch auf die "richtige" Stelle.
Bei Multithread kann es aber schief geh.

Dann gäbe es noch die RTTI, mit welcher man alle Felder durchlaufen und freigeben könnte.

Oder man verschiebt die Daten.
Delphi-Quellcode:
type
  TFoo = class(TObject)
    FData: record
      i: Integer;
      S: string;
      A: TArray<Integer>;
    end;
    procedure Clear;
  end;

procedure TFoo.Clear;
begin
  Finalize(FData);
  FillChar(FData, SizeOf(FData), 0); // oder ZeroMemory(@FData, SizeOf(FData)); ... was man halt mag
end;

// oder besser
procedure TFoo.Clear;
begin
  Finalize(FData); // gibt nur den Inhalt frei, z.B. von Strings, aber ohne die Variable selbst zurückzusetzen.
  FillChar(FData, SizeOf(FData), 0);
  Initialize(FData); // Initialisiert nur gemanagte Typen mit 0, also Strings, Variants, dynamische Array, gen. Methoden-Zeiger und IInterface, daher vorher das FillChar/ZeroMemory
end;
bzw.
FinalizeRecord aka FinalizeArray mit Lenght=1
und
InitializeRecord aka InitializeArray mit Lenght=1

Das sind auch die Methoden, welche Delphi benutzt, um globale Variablen, lokale Variablen (das was im BEGIN und END der Methode aufgerufen wird) und den Inahlt von Objekten zu initialisieren und freizugeben.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 5. Okt 2020 um 06:18 Uhr)
  Mit Zitat antworten Zitat