![]() |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
@Neutral General: Du bist einfach ein Held.
|
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Zitat:
Delphi-Quellcode:
Also .Free ruft auch einfach nur .Destroy auf wenn der Objektpointer nicht genillt ist. also eigentlich kein Unterschied.
if Self <> nil then
Destroy; Das einzige Problem was ich an .Free sehe ist, das der ObjPointer nach dem Destroy nicht genillt wird, deshalb nutze ich meist ![]() Zum genannten Thread: Es existierte nicht genügent Code um sagen zu können, ob der Fehler am .Destroy lag. Um aber Fehler schneller ausfindig zu machen ist .Free bzw FreeAndNil empfehlenswert. |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Zitat:
|
Re: Wieso lässt sich "Destroy" manuell aufrufen?
[quote="omata"]Ja genau, Regeln und Hinweise (siehe in der Hilfe zu dem Thema) sind ja auch zu vernachlässigen. {/quote] Nein. Nur wenn aus dem Hinweis ein Dogma wird, sollte man schon mal nachdenken dürfen.
Zitat:
'Einfach mal was hinnehmen' ist eine Einstellung, die diametral gegensätzlich zum denkenden Menschen steht. Zitat:
Ich will nicht weiter darauf eingehen, aber Du kennst die Geschichte von den 100.000.000 Fliegen und was sie essen und das man das dann ohne Nachzudenken auch zu sich nehmen kann, weil sich 100 Mio Fliegen ja nicht irren? Gerade einem Anfänger sollte man erklären, das es keinen fundamentalen Unterschied zwischen Free und Destroy gibt. Außer das Free einem schlechte Programmierung verzeiht, Destroy jedoch nicht. Ehrlich gesagt finde ich die Empfehlung, Destroy zu verwenden, für einen Anfänger sinnvoller. Dann fliegen ihm nämlich gleich die NIL-Exceptions um die Ohren. Zitat:
Zitat:
Zitat:
Zitat:
Ich hab da noch ne Frage: Free wird empfohlen. Schön und gut. Kann man ja nachvollziehen. Aber wieso dann nicht gleich FreeAndNil? Wieso regt man nicht darüber auf? Wieso wird die Hilfe als Bibel angesehen, aber nicht kritisiert, das Embarcadero mal wieder nur halbe Sachen macht? WENN ich einem Anfänger das 'Free'-Paradigma als Schutzwrapper empfehle, dann aber bitte "FreeAndNil". Nur DANN ist es wirklich sicher. Oder nicht? |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Der Destruktor ist ja virtuell.
Deshalb kann der Destruktor grundsätzlich nur public oder protected sein; Beides wäre möglich. Und nur zur Erinnerung: "es kann nur einen geben!". Es kann mehrere Konstruktoren geben, aber nur einen Destruktor. Und da der Destruktor den Namen "Destroy" schon in der obersten Klasse "TObject" bekommen hat, kann er sich niemals ändern. Die Deklaration für den Destruktor muss grundsätzlich immer so aussehen:
Delphi-Quellcode:
Man darf weder den Namen "Destroy" ändern noch das "override" weglassen!
destructor Destroy;override;
In Betrag #9 fehlt beim Destruktor übrigens das Override - eigentlich sollte Delphi das als Fehler betrachten. Bleibt noch die Frage, weshalb ist der Destruktor nicht protected? Ich vermute mal stark, dass die Designer von Object Pascal sich diese Frage auch gestellt haben und dann zugunsten der Einfachheit entschieden haben. 1. Grund Die Deklaration einer Klasse ist einfach übersichtlicher, wenn Konstruktor und Destruktor direkt hintereinander stehen. 2. Grund wenn garantiert ist, dass eine Objektvariable nicht nil ist, sollte man den Destruktor auch direkt aufrufen dürfen. |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Danke dafür, diese Diskussion wieder in ruhiges Gewässer geführt zu haben.
:-) |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Hallo,
ich habe eine Antwort wie "ja" oder "nein, weil ..." erwartet. Dass da so eine Diskussion entstanden ist, die schier aus dem Ruder gelaufen wäre, hätte ich nicht gedacht. Das Thema scheint also gar nicht mal so trivial zu sein. :) Danke für die Erklärungen. Ich bin zwar auch nicht viel schlauer als vorher und werde weiterhin "FreeAndNil" nutzen, wie ich es bisher auch immer gemacht habe. Eigentlich wollte ich nur wissen, wieso die Delphi-Hilfe "Destroy" nicht empfiehlt, im Code bei dem direkten Aufruf jedoch keine Warnungen kommen bzw. wieso ein Aufruf überhaupt möglich ist. Im Prinzip reicht doch "FreeAndNil" oder "Free" oder "Destroy". Zumindest hatte ich meines Wissens nie eine Situation, in der Unterschiede bei den genannten Funktionen bemerkbar gewesen wären. Wieso der Aufruf von "Destroy" nicht empfohlen wird, ist mir - ehrlich gesagt - auch nicht klar, wenn man sich ansieht, was "Destroy" macht bzw. wieso man nicht einfach "FreeAndNil" als DIE Lösung verwendet. Grüße, Matze |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 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