AGB  ·  Datenschutz  ·  Impressum  







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

Destruktor ueberschreiben - Warnung

Ein Thema von alcaeus · begonnen am 18. Apr 2005 · letzter Beitrag vom 18. Apr 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#11

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:16
Zitat von sakura:
Default-Werte werden beim Kompilieren, wenn nicht vorhanden im Aufruf "gefakt". Da aber die ganzen Delphi-Funktionen auf TObject als Basis zugreifen, finden die dort keinen Default-Wert, so wird auch keiner durch den Compiler gefakt -> immer noch eine AV wenn diese auf Deine Implementierung treffen
Also mach ich ein ueberladenes Free ohne Parameter, welches Intern das andere Free mit dem Parameter=False aufruft, das sollte dann hoffentlich mich und Delphi zufriedenstellen...

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#12

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:20
Ein Destruktor darf grundsätzlich keine Parameter haben!!
(mit Ausnahme des versteckten Self-Parameters)
Dies gilt nicht nur für Delphi sondern auch für andere Programmiersprachen wie C++ u.s.w.
Bei Delphi ist der Destruktor von Anfang an virtuell und das ist auch gut so.

Wenn ein Objekt zerstört werden soll, gibt es nur 2 Informationen:
* das Objekt (bzw. der Zeiger auf das Objekt)
* es soll zerstört werden und alle verwendete Resourcen (insb. Speicher) freigegeben werden
Du diesem Zeitpunkt ist sehr häufig nicht einmal die genaue Klasse bekannt.
Vereinfacht ist die Aufrufereihenfolge so:
TObject.Free -> TEdit.Destroy -> TWinControl.Destroy -> TControl.Destroy -> TPersistent.Destroy -> TObject->Destroy

Die Methode Free ruft intern Destroy auf:
Delphi-Quellcode:
procedure TObject.Free;
asm
        TEST EAX,EAX
        JE @@exit
        MOV ECX,[EAX]
        MOV DL,1
        CALL dword ptr [ECX].vmtDestroy
@@exit:
end;
// und jetzt mal übersetzt nach Pascal
procedure TObject.Free;
  if Assigned(self) then
     self.Destroy;
end;
Man sieht also, dass Destroy nur dann aufgerufen wird, wenn Self auf ein Objekt verweist.
Die Methode Free ist nicht virtuell und darf auch niemals verändert oder überschrieben werden !

weitere Info's:
http://www.dsdt.info/insider/sprache/destruktor.php
Andreas
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#13

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:28
Zitat von Dax:
Delphi-Referenz durchsuchenreintroduce sollte sein was du suchst.
borland
Use reintroduce when you want to hide an inherited virtual method with a new one.


Ich glaube nicht, dass das hier gewollt ist.

Die Sprachdefinition von Delphi (was Object Pascal) lässt ja mehrere Destruktoren zu, Borland rät aber davon ab, dieses feature zu benutzen. Sein Vorhandensein erhöht nicht die Mächtigkeit der Sprache. Alles, was ein Destruktor zu tun hat, weiss er - auch ohne Parameter. Über Parameter gesteuerte Aktionen im Destruktor gehören aus puristischer Sicht in eine andere Methode. Es gibt aber keine einheitliche Bestrafung für Verstösse.

Grüße vom marabu

@shmia: ein Destruktor darf Parameter haben - es muss nur bedacht werden, dass grundsätzlich die register calling convention gilt. Probier es aus - oder lese im Handbuch.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#14

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:31
Problem geloest:

Delphi-Quellcode:
procedure Free; overload;
procedure Free(SaveFile: Boolean); overload;
//..
procedure TProgramOptions.Free;
begin
  Free(False);
end; //procedure TProgramOptions.Free;

procedure TProgramOptions.Free(SaveFile: Boolean);
begin
  if SaveFile then
  begin
    //...
  end; //if SaveFile then
  if Self <> nil then
    Destroy;
end; //procedure TProgramOptions.Free(SaveFile: Boolean);
Der Compiler motzt nicht, und sobald das Ganze testfaehig ist, werd ich sehn ob ich Besuch von einer huebschen AV bekomme

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#15

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:37
Was soll das denn werden?
Self <> nil ? wie kann Self nil sein, wenn du doch auf Felder von der Instanz zugreifst bzw. in einer ihrer Methoden bist?
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#16

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:39
guck mal in TObject.Free
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
self kann Nil sein. Self ist (IMHO) ein versteckter parameter, der die Adresse der Instanz übergibt
(bitte nich schlagen wenns falsch is )
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#17

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:41
Zitat von Robert_G:
Was soll das denn werden?
Self <> nil ? wie kann Self nil sein, wenn du doch auf Felder von der Instanz zugreifst bzw. in einer ihrer Methoden bist?
Das ist kein Problem:
Delphi-Quellcode:
var
  Button: TButton;
begin
  Button := nil;
  Button.Free;
end;
Was sonst, ausser NIL sollte für Self da übergeben werden Wird es auch, kannst Du gerne mal testen. Theoretisch kannst Du in jeder Methode Self auf nil überprüfen...

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#18

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:42
Zitat von alcaeus:
Problem geloest:

Delphi-Quellcode:
procedure Free; overload;
procedure Free(SaveFile: Boolean); overload;
//..
Das gefällt meinem Auge überhaupt nicht.
Richtig wäre doch, ein Property AutoSave:Boolean einzuführen und dann
Delphi-Quellcode:
procedure TProgramOptions.Destroy;
begin
   if FAutoSave then
      SaveToFile;
   ...
   inherited;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:42
Zitat von Chimaira:
(bitte nich schlagen wenns falsch is )
Wenn es falsch ist, dann schon. Ist es aber nicht

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Destruktor ueberschreiben - Warnung

  Alt 18. Apr 2005, 17:43
Zitat von shmia:
Das gefällt meinem Auge überhaupt nicht.
Meinen auch nocht

Zitat von shmia:
Richtig wäre doch, ein Property AutoSave:Boolean einzuführen und dann
Das wäre der korrekt OOP-Weg

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 01:11 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