Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Destruktor überladen (https://www.delphipraxis.net/47712-destruktor-ueberladen.html)

Majortomster 15. Jun 2005 09:22


Destruktor überladen
 
Hallo,

ich habe in meiner Klasse den Destruktor überladen, um darin Speicher wieder freizugeben(mit free), der in den Instanzen benutzt wird.
Jetzt ist mir folgendes aufgefallen:
Wenn ich eine Instanz dieser Klasse mit .Free() freigebe, dann scheint dieser Destruktor gar nicht aufgerufen zu werden - obwohl es heißt, dass Free() nachschaut ob das Objekt nil ist und wenn nicht dann den Destruktor aufruft.

Daraufhin dachte ich mir, ich muss dann auch free() überladen, um dort auf den Destruktor zu verweisen.
Ich tat dies, nach einer Prüfung, ob self <> nil ist.

Dadurch wird der Destruktor zwar aufgerufen, aber es zeigt sich der seltsame Effekt, dass eine Exception geworfen wird wenn ich zwei Mal in Folge auf das gleiche Objekt Free() anwende.

Weiß einer wie man das handhaben kann?

Gruß, T

Bernhard Geyer 15. Jun 2005 09:26

Re: Destruktor überladen
 
Zeig mal etwas Code. Wurde der Destructor auch mit override angegeben?

phlux 15. Jun 2005 09:27

Re: Destruktor überladen
 
Code?? :stupid:
Edit: Der Geyer war schneller :zwinker:

Majortomster 15. Jun 2005 09:34

Re: Destruktor überladen
 
Klar ihr habt Recht - ein bisschen Code sagt mehr als mein halber Roman ;)

Delphi-Quellcode:
public destructor Destroy(); reintroduce; overload;
public procedure Free(); overload;
...
Delphi-Quellcode:
destructor TsqlReplace.Destroy();
begin
   ds.Free;
   fieldStrs.Free;
   datenbank := '';
   tabelle := '';
   bedingung := '';
   queryExecuted := false;
   inherited;
end;

procedure TsqlReplace.Free();
begin
   if(self <> nil) then
      Destroy();
end;

phlux 15. Jun 2005 09:36

Re: Destruktor überladen
 
Hi!
1. Reintroduce() weg
2. ersetze Overload durch override
3. Die Methode Free musst du dann nicht mehr überschreiben (ausserdem fehlt dort ein inherited)

mfg

Stevie 15. Jun 2005 09:38

Re: Destruktor überladen
 
Wahhh, Pornographie!!! (Zitat meines Ex-Informatik-Lehrers) :mrgreen:

Wenn du Blubb.Free aufrufst, ist das Objekt freigegeben, also Blubb = nil
und ein nochmaliger Zugriff auf dieses Object erzeugt eine Zugriffsverletzung,
weil es ja nunmal nicht mehr existiert.

Die Frage ist außerdem, warum hast du deinen destructor überladen???
Gibt es die Notwendigkeit, verschiedene Versionen davon zu haben?
Normalerweise reicht es, ihn zu überschreiben, falls intern benutzte
Objekt-Instanzen freigegeben werden müssen.

P.S. Phlux hat die Lösung parat ;-)

Sharky 15. Jun 2005 09:42

Re: Destruktor überladen
 
Zitat:

Zitat von Stevie
... Wenn du Blubb.Free aufrufst, ist das Objekt freigegeben, also Blubb = nil

Hai Stevie,

bist Du sicher das durch Blubb.Free Blubb auch "nil wird"? ;-)

BTW: Warum immer "blubb" ? :stupid:

Majortomster 15. Jun 2005 09:45

Re: Destruktor überladen
 
Danke schonmal für die Antwort - teste es gerade.

Zu Stevies Aussage:
Meiner Beobachtung zufolge wird durch Blubb.Free() die Referenz NICHT zu nil.
Daher endete ein wiederholter Aufruf von Free() in meinen Tests immer in einer Exception...

T

Bernhard Geyer 15. Jun 2005 09:51

Re: Destruktor überladen
 
Zitat:

Zitat von Majortomster
Meiner Beobachtung zufolge wird durch Blubb.Free() die Referenz NICHT zu nil.
Daher endete ein wiederholter Aufruf von Free() in meinen Tests immer in einer Exception...

Dafür gibt in neuen Delphi-Versionen ja FreeAndNil!

Stevie 15. Jun 2005 10:04

Re: Destruktor überladen
 
Zitat:

Zitat von Sharky
bist Du sicher das durch Blubb.Free Blubb auch "nil wird"? ;-)

BTW: Warum immer "blubb" ? :stupid:

Nein, natürlich nicht, hab mich falsch ausgedrückt... :oops:
Ich wollte damit sagen, dass die Objekt-Instanz freigegeben wird,
und nicht mehr gültig ist, der Zeiger kann nach wie vor auf den
Speicherbereich zeigen, wo sich das Objekt befand.

Findest du Blubb nicht gut? ... Ist doch inzwischen sowas wie Foo, oder nicht? ;-)

Zitat:

Zitat von Majortomster
Zu Stevies Aussage:
Meiner Beobachtung zufolge wird durch Blubb.Free() die Referenz NICHT zu nil.
Daher endete ein wiederholter Aufruf von Free() in meinen Tests immer in einer Exception...

Stimmt, aber der Aufruf des ererbten destructors führt dann ins nirvana.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Seite 1 von 2  1 2      

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