![]() |
Wieso lässt sich "Destroy" manuell aufrufen?
Hallo,
rein interessehalber: Wieso lässt sich "Destroy" manuell aufrufen, obwohl man es nicht aufrufen soll? Da bietet es sich doch an, diese Methode als "private" oder "protected" zu deklarieren, damit ein Aufruf von außen gar nicht erst möglich ist. Liegt das in der Abwärtskompatibilität begründet? Wenn ja, dann wäre eigentlich eine Compiler-Warnung sinnvoll. Ganz nachvollziehen kann ich das nicht. Klärt mich auf. ;) Grüße, Matze |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Es ist keineswegs schlimm, Destroy aufzurufen. Man bekommt auch keine Pickel davon. Und die Anwendung läuft, ordentliche Implementierung vorausgesetzt, genauso sicher, wie mit Free.
Free ist doch nur was für Schlampen :mrgreen: (falls man so blöd ist, und ein NIL-Objekt freigeben will), aber da Objekte nicht nil sein sollten, kann man doch Destroy aufrufen. Ich verstehe die Einwände in ![]() Ich sehe das so: Wenn ein Objekt NIL ist, mach ich sowieso etwas grundlegend falsch. Ich kann mir keine Situation vorstellen bei der dieser Code *nicht* funktioniert:
Delphi-Quellcode:
MyObject := TMyObject.Creaste;
Try MyObject.Work; Finally MyObject.Destroy; End; |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Ja genau, Regeln und Hinweise (siehe in der Hilfe zu dem Thema) sind ja auch zu vernachlässigen. Nicht einfach mal was hinnehmen, sondern immer gegen an. Ja, das ist das was heutzutage so (im Prinzip) überall abgeht, also wieso nicht auch hier.
Und provozieren, das ist natürlich auch immer wichtig und dann schnell den richtigen Schmilie nicht vergessen, damit man hinterher immer sagen kann: oh war doch nicht so gemeint, schon klar. Edit: Wenn ein Anfänger hier also eine Frage stellt, sollen wir ihm nur seinen konkreten Fehler erklären bzw. ihm helfen, seinen Fehler zu beheben. Falls in seinem Quellcode noch andere unschöne Dinge zu finden sind, so halten wir lieber den Rand und sagen nichts dazu? Immerhin kommen solche Aussagen ja nicht von irgend jemandem (Moderator?). Wie war das mit dem: Als Vorbild vorrangehen? Immerhin wir hier eine Antwort in einem anderen Thread an den Pranger gestellt. Da kann ich nur noch mir dem Kopf schütteln. Einfach schade. |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Zitat:
Hinnehmen ist wohl immer das beste was? Selbstständiges Denken ist unerwünscht oder was? Man oh man.. Peinlich peinlich ... :wall: Edit: Nachdem ich jetzt dein Edit gelesen hab.. Sagmal bist du betrunken? Ich geh besser schlafen bevor ich hier irgendwelche virtuellen Mordgelüste bekomme ... |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Das war klar, dass soetwas unqualifiziertes von dir kommen muss. einfach unglaublich
|
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Wieso unqualifiziert?
Was war denn an deinem Beitrag qualifiziert? Das Thema was Matze angesprochen hat ist einfach nur eine Diskussion über eine gewisse Sache. Und es ist eine durchaus berechtigte Frage. Ich finde es gut wenn jemand sich mal fragt "Warum nicht eigentlich Destroy?" anstatt einfach das "Free" hinzubeeten weil es ja "so üblich" ist. Vielleicht ergibt sich ja irgendein echtes Argument GEGEN Destroy. Aber im Moment kann ich die Beiträge und (ich nenne es mal) "Zweifel" von Matze und alzaimar durchaus nachvollziehen. Wenn man ordentlich programmiert, dann ist .Free grundsätzlich nicht nötig. |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Das habe ich auch gar nicht gemeint. So eine Diskussion ist doch völlig ok.
Trotzdem kann man doch einem Anfänger ruhig den Weg so erklären wie er selbst von Delphi vorgegeben wird. Immerhin steht eben genau in der Hilfe, dass man Destroy nicht selber aufrufen sollte. Gut daran muss man sich ja nicht halten. Aber man kann doch einem Anfänger wenigstens diesen Tipp geben. Was ist so schlimm daran? Und das mit dem hinnehmen war jetzt nicht so gemeint, dass man nicht mehr selber Denken soll. Das war so gemeint, dass wenn es von Delphi (in diesem Fall von der Delphi-Hilfe) schon so vorgegeben wird und dort ganz exakt drin steht, dass man Destroy nicht selber aufrufen soll. Warum muss ich mich dann dagegen entscheiden? Was ist an dieser sehr exakten Aussage so schlimm, warum muss ich mich unbedingt dagegen entscheiden. Gut ich kann es, aber warum? Warum immer gegen an? Nur weil es toll ist immer gegen alles zu sein? Bei so etwas kann man doch auch einfach etwas hinnehmen. Mehr war nicht gemeint. |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Also ich könnte mir schon vorstellen, dass man das in Delphi 1 oder früher so festgelegt hat, um dem Benutzer der Klasse doch die Freiheit zu geben, den Destruktor direkt von außen aufrufen, falls man es möchte. Und später hat man es vielleicht der Kompatibilität halber beibehalten...
|
Re: Wieso lässt sich "Destroy" manuell aufrufen?
War da nicht auch was mit Abstraktheit? Also wenn ich jetzt eine Klasse hab:
Delphi-Quellcode:
Wenn Destroy jetzt nicht grad abstarkt ist, ruft das den Destruktor nur von TObject auf, und hinterlässt ein erstelltes TBlub als Speicherleck. Da ich die Sourcen (bzw. Delphi) nicht hier hab, kann ich das nicht genau prüfen - aber sollte Free evtl. sowas behandeln? *kopfkratz* Irgendwas war da auf jeden Fall...
type
TFoo = class private Bar: TBlub; public constructor Create; destructor Destroy; end; implementation constructor TFoo.Create; begin Bar := TBlub.Create; end destructor TFoo.Destroy; begin Bar.Free; end; {andere Unit} uses UnitMitTFoo; var f: TFoo; o: TObject; begin f := TFoo.Create; o := f; o.Destroy; end; |
Re: Wieso lässt sich "Destroy" manuell aufrufen?
Zitat:
Es geht auch nicht darum dass hier irgendjemand Werbung für Destroy gemacht hat oder "aus Prinzip" gegen Free. alzaimar hat nur angemerkt, dass es bei sauberer Programmierung kein Problem sein sollte Destroy zu benutzen. Hast du dir mal den Code von Free angeschaut oder dir darüber Gedanken gemacht WARUM Free und nicht Destroy? Oder hast du es "einfach hingenommen" ? Ich finde es gut wenn sich Leute auch mal über Dinge Gedanken machen oder Dinge hinterfragen, die eigentlich "klar" sind oder von der Allgemeinheit "hingenommen" werden. Von daher habe ich absolut kein Verständnis für dieses "Theater" was du da total aus heiterem Himmel provoziert hast. Es ging und geht NICHT darum immer aus Prinzip GEGEN etwas zu sein. Es geht darum sich einfach mal Gedanken zu machen und die Gedanken mit anderen zu Teilen und vielleicht ne Diskussion zu starten mit Leuten die sich auch schon darüber Gedanken gemacht haben oder durch diese Diskussion andere Leute zum Denken anzuregen. Wenn du sowas nicht nachvollziehen kannst dann würde ich vorschlagen, dass du einfach schweigst ... PS: Bekommt man von dir generell keine Antworten auf PNs? |
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 22:57 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