AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Wieso lässt sich "Destroy" manuell aufrufen?
Thema durchsuchen
Ansicht
Themen-Optionen

Wieso lässt sich "Destroy" manuell aufrufen?

Ein Thema von Matze · begonnen am 10. Jan 2010 · letzter Beitrag vom 11. Jan 2010
Antwort Antwort
Seite 2 von 2     12   
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#11

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 10. Jan 2010, 23:36
@Neutral General: Du bist einfach ein Held.
  Mit Zitat antworten Zitat
Benutzerbild von mleyen
mleyen

Registriert seit: 10. Aug 2007
609 Beiträge
 
FreePascal / Lazarus
 
#12

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 10. Jan 2010, 23:43
Zitat von Medium:
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...
Delphi-Quellcode:
if Self <> nil then
  Destroy;
Also .Free ruft auch einfach nur .Destroy auf wenn der Objektpointer nicht genillt ist. also eigentlich kein Unterschied.
Das einzige Problem was ich an .Free sehe ist, das der ObjPointer nach dem Destroy nicht genillt wird, deshalb nutze ich meist Delphi-Referenz durchsuchenFreeAndNil.
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#13

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 11. Jan 2010, 01:46
Zitat von mleyen:
...Also .Free ruft auch einfach nur .Destroy auf wenn der Objektpointer nicht genillt ist. also eigentlich kein Unterschied.
So ungefähr siehts aus. ABER : Was, wenn dazwischen noch was gemacht werden soll ? Also vor dem NIL setzen muss noch irgendwo anders aufgeräumt werden, irgendwelche Aktionen etc. ? Bei Original-Free hat man da wohl keine Chance. Ansonsten gibts Freiraum. Das NIL-Setzen sollte wohl auch kein Problem sein.
Gruß
Hansa
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#14

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 11. Jan 2010, 07:28
[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 von omata:
Nicht einfach mal was hinnehmen, sondern immer gegen an...
... und hinterfragen.
'Einfach mal was hinnehmen' ist eine Einstellung, die diametral gegensätzlich zum denkenden Menschen steht.
Zitat von omata:
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.
Der Smilie bezog sich auf die 'Schlampe', damit man nicht denkt, ich würde a) Free nicht verwenden bzw. b) Programmierer, die Free verwenden, als Schlampen bezeichnen.

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:
Immerhin kommen solche Aussagen ja nicht von irgend jemandem (Moderator?).
Ja. Einem Moderator.

Zitat:
Wie war das mit dem: Als Vorbild vorrangehen?
Davon ist mir nichts bekannt.

Zitat:
Immerhin wir hier eine Antwort in einem anderen Thread an den Pranger gestellt ... Einfach schade.
Ich finde es schade, das ein fähiger Kopf (Du) sich zu so einer nicht durchdachten Tirade hinreißen lässt.

Zitat von omata:
Trotzdem kann man doch einem Anfänger ruhig den Weg so erklären wie er selbst von Delphi vorgegeben wird.
So weit ich mich erinnere, wurde die Frage nicht von einem Anfänger gestellt.


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?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#15

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 11. Jan 2010, 09:14
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:
destructor Destroy;override; Man darf weder den Namen "Destroy" ändern noch das "override" weglassen!
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.
fork me on Github
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#16

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 11. Jan 2010, 09:22
Danke dafür, diese Diskussion wieder in ruhiges Gewässer geführt zu haben.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#17

Re: Wieso lässt sich "Destroy" manuell aufrufen?

  Alt 11. Jan 2010, 17:15
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
  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 05:18 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