AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi inherited Free; <-- warum kommt da eine exeption?!
Thema durchsuchen
Ansicht
Themen-Optionen

inherited Free; <-- warum kommt da eine exeption?!

Ein Thema von yankee · begonnen am 20. Jan 2006 · letzter Beitrag vom 22. Jan 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 06:25
Hallo, ich habe mir gerade eine Klasse geschrieben, weil ich mir für den Minichat, den ich demletzt hier in OpenSource veröffentlich habe auch noch ein Delphi-Client schreiben will. In meinem destructor:
Delphi-Quellcode:
destructor TMiniChatClient.Free;
begin
    Logout;
    inherited Free; //<-- exception hier!
end;
tritt aber eine exeption auf. Meine Klasse ist von TComponent abgeleitet.
Jemand eine Idee, woher das kommen kann *ratlos*.

Die komplette Klasse findet ihr im Anhang.
Angehängte Dateien
Dateityp: pas minichatclient_148.pas (3,2 KB, 4x aufgerufen)
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#2

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 06:51
Du solltest nicht Free sondern Destroy benutzen.
  Mit Zitat antworten Zitat
Vjay

Registriert seit: 2. Dez 2003
Ort: Berlin/Eschede
481 Beiträge
 
Delphi 7 Professional
 
#3

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 10:10
Also ich versuche mal zu raten warum das so ist.

Das unterste Free (von TObject) ruft Destroy auf.
Da Free eigentlich eine procedure ist und kein destructor funktioniert das ganze auch, denn ein destructor gibt am Ende das eigentliche Objekt frei.

Da er nun free als destructor deklariert hat, welches wiederum Destruktor Nr.2 namens "destroy" aufruft, wird 2x versucht das eigentliche Objekt per Compilermagic freizugeben.

Richtig?
Wer später bremst ist eher tot.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#4

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 14:36
Thx... Wenn ich in meiner Free-procedure inherited Destroy statt inherited Free aufrufe funzt es...
Nur wieso das funzt ist mir jetzt noch nicht gan klar...
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 14:42
Zitat von yankee:
Nur wieso das funzt ist mir jetzt noch nicht gan klar...
Vjays Erklärung ist AFAIK richtig, es werden einfach zwei Destruktoren auf die gleiche Instanz losgelassen.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#6

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 14:43
Du solltest Free in deiner eigenen Klasse nicht überschreiben.

Überschreibe den Destructor Destroy.


Delphi-Quellcode:
  TMiniChatClient = class
  private
    { Private declarations }
    sid: string;
    lastid: string;
    nick: string;
    error: string;
    chaturl: string;
  protected
    { Protected declarations }
  public
    { Public declarations }
    constructor Create(Owner: TComponent; const url: string);
    destructor Destroy; override;
    function Login(const nickname: string):integer;
    function Logout:integer;
    function postMsg(const txt: string):integer;
    function getNewMsgs:TJvSimpleXmlElem;
  published
    { Published declarations }
  end;

Der Destructor Destroy:
Delphi-Quellcode:
destructor TMiniChatClient.Destroy;
begin
  Logout;

  inherited;
end;


Dieser Destructor wird beim Aufruf von Free automatisch aufgerufen. Das sollte dein Problem lösen.
  Mit Zitat antworten Zitat
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#7

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 15:21
SO, ich habe das mal geändert und die geänderte Version der MiniChatClient.pas hochgeladen.
Jetzt habe ich plötzlich ein ganz anderes Problem:
[Fatal Error] MiniChatClient.pas(1): Program or unit 'MiniChatClient.pas' recursively uses itself
Ich habe eigentlich nichts anderes verändert als die Destroy-procedure... Wie kann es denn jetzt dazu kommen?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#8

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 15:29
Zitat von DevilsCamp:
Du solltest nicht Free sondern Destroy benutzen.
Es ist IMHO gerade umgekehrt. in der OH steht:

Zitat:
Mit Free wird ein Objekt freigegeben. Wenn die Objektreferenz nicht nil ist, wird Destroy aufgerufen. Alle zur Laufzeit instantiierten Objekte, die keinen Eigentümer besitzen, sollten mit einem Aufruf von Free aufgelöst werden, damit sowohl das Objekt als auch der zugehörige Speicher korrekt freigegeben wird. Im Gegensatz zu Destroy funktioniert Free auch dann, wenn das Objekt nil ist. Es ist also kein Fehler, die Methode für ein Objekt aufzurufen, das niemals initialisiert wurde.
Otto
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#9

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 15:31
Ich meinte damit:
Wenn man eine Klasse erstellt, dann soll man den Destructor Destroy überschreiben und nicht Free zu einem Destructor machen.



Aus dem Code heraus sollte man natürlich
KLASSE.Free aufrufen um den Speicher wieder freizugeben.
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: inherited Free; <-- warum kommt da eine exeption?!

  Alt 20. Jan 2006, 17:03
Zitat von DevilsCamp:
Ich meinte damit:
Wenn man eine Klasse erstellt, dann soll man den Destructor Destroy überschreiben und nicht Free zu einem Destructor machen.
Thx 4 info. Bis jetzt hab ich auch immer Free überschrieben... Werd ich ab nun ändern. Wieder was gelernt.

mfg, mh166
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  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 15:10 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