AGB  ·  Datenschutz  ·  Impressum  







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

Destruktor überladen

Ein Thema von Majortomster · begonnen am 15. Jun 2005 · letzter Beitrag vom 15. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#1

Destruktor überladen

  Alt 15. Jun 2005, 10:22
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:26
Zeig mal etwas Code. Wurde der Destructor auch mit override angegeben?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#3

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:27
Code??
Edit: Der Geyer war schneller
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#4

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:34
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;
  Mit Zitat antworten Zitat
Benutzerbild von phlux
phlux

Registriert seit: 4. Nov 2002
Ort: Witten
1.335 Beiträge
 
Delphi 6 Personal
 
#5

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:36
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
Christian "phlux" Arndt
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:38
Wahhh, Pornographie!!! (Zitat meines Ex-Informatik-Lehrers)

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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:42
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" ?
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Majortomster

Registriert seit: 11. Mai 2005
27 Beiträge
 
#8

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.202 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Destruktor überladen

  Alt 15. Jun 2005, 10:51
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!
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

Re: Destruktor überladen

  Alt 15. Jun 2005, 11:04
Zitat von Sharky:
bist Du sicher das durch Blubb.Free Blubb auch "nil wird"?

BTW: Warum immer "blubb" ?
Nein, natürlich nicht, hab mich falsch ausgedrückt...
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 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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:45 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