AGB  ·  Datenschutz  ·  Impressum  







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

Klassen: Clear -> Free -> Create?

Ein Thema von Benmik · begonnen am 4. Okt 2020 · letzter Beitrag vom 6. Okt 2020
Antwort Antwort
Seite 1 von 2  1 2      
Benmik

Registriert seit: 11. Apr 2009
557 Beiträge
 
Delphi 12 Athens
 
#1

Klassen: Clear -> Free -> Create?

  Alt 4. Okt 2020, 23:50
Ich habe eine Klasse mit ziemlich vielen Feldern, die ich bei einem Clear alle händisch zurücksetzen müsste.
Da liegt es nahe, einfach im Clear ein Free und danach ein Create zu schreiben.
Das Free klappt auch, aber wenn ich danach Self := TDingsbums.Create schreibe, dann meint der Compiler, "Self" würde nie benutzt.

Spaßeshalber habe ich mal versucht, eine Instanz einfach in einer ihrer Methoden freizugeben und wieder zu erzeugen. Also ungefähr so:
Delphi-Quellcode:
TCorona = class(TObject)
  procedure VirusBeißtZu;
end;

var Corona:TCorona;

...

procedure TCorona.VirusBeißtZu;
begin
  Corona.Free;
  Corona := TCorona.Create;
end;
Zu meinem Erstaunen scheint das zu funktionieren.

Was ist von alledem zu halten?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 5. Okt 2020, 00:47
Es ist eigentlich ganz einfach.

Du hast eine globale Variable, der Du letztlich eine neu erzeugte Instanz zuweist.
Insofern nichts besonderes.

Die Prozedur hast Du allerdings als Methode angelegt.
Insofern muss erst mal eine Instanz erzeugen damit Du die Methode korrekt ausführen kannst.

Du könntest die Methode alternativ als Klassenmethode (class procedure ...) anlegen, damit Du sie immer aufrufen kannst.
Oder Du erzeugst einfach eine ganz normale Prozedur (nicht als Teil einer Klasse), in der Du die neue Instanz erzeugst und zuweist.

Du kannst damit halt immer nur eine globale Variable neu zuweisen.

Du könntest auch eine Prozedur erstellen und eine Variable als var-Parameter übergeben und dieser eine neue Instanz zuweisen.


Da gibt es unterschiedliche Möglichkeiten - ABER ...
... die Klasseneigenschaften einfach in einer Methode "Clear" aufzuräumen ist m.E. der beste Weg.

Die anderen Lösungen empfinde ich als unnötig komplitziert und unübersichtlich. Für das Zurücksetzen von Eigenschaften bietet sich eine Methode Clear oder Init doch nahezu an.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)

Geändert von stahli ( 5. Okt 2020 um 10:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 5. Okt 2020, 00: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 5. Okt 2020, 06:24
Moin...
Die eigentliche Frage ist nicht beantwortet...
Zitat:
Was ist von alledem zu halten?
...nichts! Das das funktioniert ist eher Zufall Instanzen die in "Benutzung" sind, Pointer in Listen (die ihre Objekte selbst freigeben), sind sind nicht mehr gültig, weil der Pointer ein anderer und der vorhergehende freigeben ist. Dann dürfte es Zugriffsverletzungen hageln...
Wenn mir ein simpler Vergleich einfällt, lasse ich es euch wissen...

Geändert von haentschman ( 5. Okt 2020 um 06:48 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.736 Beiträge
 
Delphi 6 Enterprise
 
#5

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

  Alt 5. Okt 2020, 09:59
[Offtopic]
Wenn der Baron von Münchhausen eine solche Phönix-Klasse entwickelt, könnte es vielleicht funktionieren, aber im realen Leben ist das eine schlechte Idee.
[/Offtopic]

Anders sieht das aus, wenn das Clear von aussen aufgerufen wird, denn dann kann man auch von aussen stattdessen das Objekt freigeben und neu erstellen.
Ralph
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 5. Okt 2020, 11:17
...nichts! Das das funktioniert ist eher Zufall Instanzen die in "Benutzung" sind, Pointer in Listen (die ihre Objekte selbst freigeben), sind sind nicht mehr gültig, weil der Pointer ein anderer und der vorhergehende freigeben ist. Dann dürfte es Zugriffsverletzungen hageln...
Noch schlimmer.
Im NextGen funktioniert es nichtmal, da du das Ojekt garnicht freigeben kannst, so lange noch andere Referenzen existieren,
und selbst wenn man es schafft, würde man dadurch eventuelle Weak-Referenzen schrotten. (auf nil setzen)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

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

  Alt 5. Okt 2020, 11:38
Zitat:
im nextgen
pgfnang
Markus Kinzler
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#8

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

  Alt 5. Okt 2020, 13:34
Zitat:
im nextgen
pgfnang
Insider Witz?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#9

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

  Alt 5. Okt 2020, 14:02
next-gen ist tot
(previous-gen fomerly known as next-gen)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 5. Okt 2020, 17:16
dann halt MobileDingsabums ... das mit dem ARCZeugs
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 17:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz