![]() |
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 |
Re: Destruktor überladen
Zeig mal etwas Code. Wurde der Destructor auch mit override angegeben?
|
Re: Destruktor überladen
Code?? :stupid:
Edit: Der Geyer war schneller :zwinker: |
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; |
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 |
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 ;-) |
Re: Destruktor überladen
Zitat:
bist Du sicher das durch Blubb.Free Blubb auch "nil wird"? ;-) BTW: Warum immer "blubb" ? :stupid: |
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 |
Re: Destruktor überladen
Zitat:
|
Re: Destruktor überladen
Zitat:
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:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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