AGB  ·  Datenschutz  ·  Impressum  







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

Destruktor überladen

Ein Thema von Majortomster · begonnen am 15. Jun 2005 · letzter Beitrag vom 15. Jun 2005
Antwort Antwort
Seite 2 von 2     12   
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#11

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:33
Aber der Aufruf des überschriebenen Destruktors führt ins Chaos (da dort auch Free für klasseninterne Komponenten eingesetzt wird).
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#12

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:38
Eigentlich logisch das alles was das zu free-ende Objekt als Parent hat mit ge-free-ed wird oder habe ich die aussage falsch aufgenommen?
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#13

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:49
Ja das ist logisch - aber mittlerweile entgeht mir total der Sinn von Free.
Ich hatte das so verstanden, dass dies eine SICHERE Art ist, den Destruktor aufzurufen (oder eben nicht, wenn die Referenz nil ist).
Aber was ist diese Methode wert, wenn sie selbst in Bedrängnis kommt (Exception mit Speicherlesefehler), wenn sie zwei Mal in Folge aufgerufen wird..?
In einem äußerst komplexen Programm mit sehr vielen verschiedenen Objekten die viel Speicher fressen, ist man da echt aufgeschmissen... oder sehe ich das falsch?

(jedenfalls klappt es jetzt super mit FreeAndNil(objekt) - danke )

T
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#14

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:53
Zitat von Majortomster:
Ja das ist logisch - aber mittlerweile entgeht mir total der Sinn von Free.
Ich hatte das so verstanden, dass dies eine SICHERE Art ist, den Destruktor aufzurufen (oder eben nicht, wenn die Referenz nil ist).
Aber was ist diese Methode wert, wenn sie selbst in Bedrängnis kommt (Exception mit Speicherlesefehler), wenn sie zwei Mal in Folge aufgerufen wird..?
In einem äußerst komplexen Programm mit sehr vielen verschiedenen Objekten die viel Speicher fressen, ist man da echt aufgeschmissen... oder sehe ich das falsch?

(jedenfalls klappt es jetzt super mit FreeAndNil(objekt) - danke )

T
Genau für solche "äußerst komplexen Programme mit sehr vielen verschiedenen Objekten die viel Speicher fressen" ist FreeAndNil gedacht. Dann kann nämlich nix mehr passieren.
Free kann man dann immer noch "gebrauchen", z.B. für lokale Objekte; da bringt das "nillen" nix, wenn die Procedure eh zu ende ist.

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:59
Wenn du deinen Destructor mit overload deklarierst ist es eine ANDERE Methode als der Destructor des Vorgängers und damit wiederum ein anderer als der von TObject!!!
Free wird TObject.Destroy aufrufen. Nur wenn du es ÜBERSCHREIBST wird dann dein Code ausgeführt.
Und ja, das ist ein bequemer und sicherer Weg Speicher freizugeben. Du solltest dich einfach noch ein bisschen in OO Vorgehensweisen belesen.
Virtual methods sind IMHO eines der wichtigsten Prinzipien von objektorientierter Programmierung, das sollte man als Delphisti schon wissen.

@r2c2
Habe ich früher auch oft gemacht.
Mittlerweile wirkt FreeAndNil für mich wie irgendein Artefakt, dass irgendwie nicht so richtig in den Code passt.
Wie oft hat man schon eine Referenz, die man auf nil setzen will, die kein Interface ist?
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#16

Re: Destruktor überladen

  Alt 15. Jun 2005, 12:15
Zitat von Robert_G:
@r2c2
Habe ich früher auch oft gemacht.
Mittlerweile wirkt FreeAndNil für mich wie irgendein Artefakt, dass irgendwie nicht so richtig in den Code passt.
Wie oft hat man schon eine Referenz, die man auf nil setzen will, die kein Interface ist?
FreeAndNil Artefakt?
Zugegeben ich benutze FreeAndNil kaum, aber das hängt meiner Meinung daran, dass ich noch nicht so lange OO programmiere. Bisher hab ich fast nur lokale Objekte benutzt und ansonsten eine Art "Matster-Objekt" erstellt, das alle anderen Objekte erzeugt un im Destructor wieder freigibt. Ich kann mir aber duchaus vorstellen, dass in größeren Projekten FreeAndNil sinnvoll sein kann. Oder?

mfg

Christian
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#17

Re: Destruktor überladen

  Alt 15. Jun 2005, 12:56
Zitat von r2c2:
FreeAndNil Artefakt?
Zugegeben ich benutze FreeAndNil kaum, aber das hängt meiner Meinung daran, dass ich noch nicht so lange OO programmiere. Bisher hab ich fast nur lokale Objekte benutzt und ansonsten eine Art "Matster-Objekt" erstellt, das alle anderen Objekte erzeugt un im Destructor wieder freigibt.
Dann ist der Container ja auch weg. Warum sollte man also extra einen Zeiger auf nil setzen, wenn der einzige, der den Zeiger benutzt auch schon im Sterben liegt?
Free ist eine Methode, FreeAndNil ist eine lose Funktion, vllt liegt es daran, dass es mir irgendwie komisch und fehl am Platze vorkommt.
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#18

Re: Destruktor überladen

  Alt 15. Jun 2005, 16:08
@Robert_G
Zitat von Robert_G:
Dann ist der Container ja auch weg. Warum sollte man also extra einen Zeiger auf nil setzen, wenn der einzige, der den Zeiger benutzt auch schon im Sterben liegt?
Ich glaub du hast meinen Post nicht ganz verstenden. Les ihn dir am Besten nochmal durch:

Zitat von r2c2:
FreeAndNil Artefakt?
Zugegeben ich benutze FreeAndNil kaum, aber das hängt meiner Meinung daran, dass ich noch nicht so lange OO programmiere. Bisher hab ich fast nur lokale Objekte benutzt und ansonsten eine Art "Matster-Objekt" erstellt, das alle anderen Objekte erzeugt un im Destructor wieder freigibt. Ich kann mir aber duchaus vorstellen, dass in größeren Projekten FreeAndNil sinnvoll sein kann.
Letzterer Satz bedeutet:
1. Ich benutze FreeAnd Nil kaum
2. Das war in meinen beschriebenen 2 Fällen auch nicht notwendig
3. In größeren Projekten(meinend nicht in meinen bisherigen) kann dies aber IMHO sinnvoll sein

Zitat von Robert_G:
Free ist eine Methode, FreeAndNil ist eine lose Funktion, vllt liegt es daran, dass es mir irgendwie komisch und fehl am Platze vorkommt.
Ähm, keine Ahnung, du musst schon selbst wissen, warum dir was komisch vorkommt, hört sich für mich aber logisch an.

@All
Gibt es eigentlich eine sinnvolle Begründung dafür den destructor zu überladen? Warum sollte man das tun? Reicht ein Destructor nicht?

mfg

Christain
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#19

Re: Destruktor überladen

  Alt 15. Jun 2005, 16:34
Zitat von r2c2:
@Robert_G Ich glaub du hast meinen Post nicht ganz verstenden. Les ihn dir am Besten nochmal durch:
Hmmm.... den habe ich wohl etwas falsch verstanden. Sehe deshalb meinen beitrag als Bestätigung für die Punkte 1 & 2.
Nur denn verstehe ich nicht ganz:
Zitat von r2c2:
3. In größeren Projekten(meinend nicht in meinen bisherigen) kann dies aber IMHO sinnvoll sein
Mir fällt da einfach kein Fall ein, in dem man es mit einer Interface instanz nicht einfacher lösen könnte...
Zitat von r2c2:
Gibt es eigentlich eine sinnvolle Begründung dafür den destructor zu überladen? Warum sollte man das tun? Reicht ein Destructor nicht?
Man sollte es nicht.
TObject.Free ruft TObject.Destroy auf. Jeder Vorfahre/Nachfahre wird DIESEN Destructor überschrieben haben.
Und jeder, der die Klasse benutzt wird wohl auch Free oder den Destructor von TObject aufrufen um aufzuräumen.
Der Code in einem nicht überschriebenen Destructor wird also effektiv nie ausgeführt werden.
Deshalb gleich nochmal: Delphi-Referenz durchsuchenvirtual & Delphi-Referenz durchsuchenoverride
  Mit Zitat antworten Zitat
r2c2

Registriert seit: 9. Mai 2005
Ort: Nordbaden
925 Beiträge
 
#20

Re: Destruktor überladen

  Alt 15. Jun 2005, 17:39
Zitat von Robert_G:
Zitat von r2c2:
3. In größeren Projekten(meinend nicht in meinen bisherigen) kann dies aber IMHO sinnvoll sein
Mir fällt da einfach kein Fall ein, in dem man es mit einer Interface instanz nicht einfacher lösen könnte...
*an den Haaren herbeizieh* Wenn man viele Objekte erstellt und die vorher(d.h. nicht erst im Desructor der Containerklasse) freigeben will. Ich hab mich allerdings mit Interfaces noch zu wenig befasst, alsdass ich sagen könnte ob mans damit einfacher hinkriegt.

Zitat von Robert_G:
Zitat von r2c2:
Gibt es eigentlich eine sinnvolle Begründung dafür den destructor zu überladen? Warum sollte man das tun? Reicht ein Destructor nicht?
Man sollte es nicht.
TObject.Free ruft TObject.Destroy auf. Jeder Vorfahre/Nachfahre wird DIESEN Destructor überschrieben haben.
Und jeder, der die Klasse benutzt wird wohl auch Free oder den Destructor von TObject aufrufen um aufzuräumen.
Der Code in einem nicht überschriebenen Destructor wird also effektiv nie ausgeführt werden.
Deshalb gleich nochmal: Delphi-Referenz durchsuchenvirtual & Delphi-Referenz durchsuchenoverride
Jein, wenn man sich n eigenes Free bastelt vielleicht schon. Das war aber auch gar nicht meine Frage. Man könnte doch theoretisch den destuctor overriden und overloaden. Dann könnte man sich n eigenes Free basteln und bedingt die einzelnen Destruktoren aufrufen. Jetzt meine Frage: Macht das sinn? Und wenn ja: welchen?

mfg

Christian

P.S.: virtual und override sind mir durchaus bekannt.
Kaum macht man's richtig, schon klappts!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 10:42 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