Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi inherited Free; <-- warum kommt da eine exeption?! (https://www.delphipraxis.net/61335-inherited-free%3B-warum-kommt-da-eine-exeption.html)

yankee 20. Jan 2006 06:25


inherited Free; <-- warum kommt da eine exeption?!
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

DevilsCamp 20. Jan 2006 06:51

Re: inherited Free; <-- warum kommt da eine exeption?!
 
Du solltest nicht Free sondern Destroy benutzen.

Vjay 20. Jan 2006 10:10

Re: inherited Free; <-- warum kommt da eine exeption?!
 
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? :-D

yankee 20. Jan 2006 14:36

Re: inherited Free; <-- warum kommt da eine exeption?!
 
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...

Khabarakh 20. Jan 2006 14:42

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

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.

DevilsCamp 20. Jan 2006 14:43

Re: inherited Free; <-- warum kommt da eine exeption?!
 
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.

yankee 20. Jan 2006 15:21

Re: inherited Free; <-- warum kommt da eine exeption?!
 
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?

Ferber 20. Jan 2006 15:29

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

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.

DevilsCamp 20. Jan 2006 15:31

Re: inherited Free; <-- warum kommt da eine exeption?!
 
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
Delphi-Quellcode:
KLASSE.Free
aufrufen um den Speicher wieder freizugeben.

mh166 20. Jan 2006 17:03

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

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. :D :dp:

mfg, mh166

Khabarakh 20. Jan 2006 17:16

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

Zitat von mh166
Zitat:

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...

Sollte eigentlich daran ersichtlich sein, dass Free überhaupt nicht überschrieben werden kann :wink: .

@yankee: Das liegt sicher nicht an der Modifikation. Schau nochmal genau deine uses-Klauseln durch.

yankee 21. Jan 2006 00:55

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

Zitat von Khabarakh
@yankee: Das liegt sicher nicht an der Modifikation. Schau nochmal genau deine uses-Klauseln durch.

Ich habe die mir jetzt 10 mal durchgelesen und mit der qt-Suche den Quelltext nach weiteren uses durchsucht, damit ich wirklich nichts übersehe usw.
Ich check' das einfach nicht...

xaromz 21. Jan 2006 13:22

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

das Problem hatte ich auch ab und zu. Meistens hilft dann ein komplettes Erstellen des Programms (nicht nur ein Compilieren des Geänderten). Manchmal muss man auch einfach die Unit verändern (z. B. ein Zeichen einfügen, das Zeichen wieder löschen und dann speichern). Danach klappt's dann wieder.
Ist wohl ein Bug im Compiler.

Gruß
xaromz

mh166 21. Jan 2006 22:52

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

Zitat von Khabarakh
Sollte eigentlich daran ersichtlich sein, dass Free überhaupt nicht überschrieben werden kann :wink: .

Hmm... Das ich das nich gemerkt hab liegt - wie ich gerade noch mal nachgeguckt hab - daran, dass ich bis jetzt immer von TObject "abgelitten" ;) (wie heißt das eigentlich richtig? :gruebel:) hab. Und das hat gar keine Free-Procedure. Aber mein inherited; hat er bis jetzt immer anstandslos akzeptiert. :lol:

mfg, mh166

malo 21. Jan 2006 22:54

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

Zitat von mh166
[...]von TObject "abgelitten" ;) (wie heißt das eigentlich richtig? :gruebel:)

Nein, es heißt "abgeleitet" :mrgreen:
Oder hat es was mit leiden zu tun? :lol:

alzaimar 21. Jan 2006 22:59

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

Zitat von malo
Zitat:

Zitat von mh166
[...]von TObject "abgelitten" ;) (wie heißt das eigentlich richtig? :gruebel:)

Nein, es heißt "abgeleitet" :mrgreen:
Oder hat es was mit leiden zu tun? :lol:

Manchmal schon...

xaromz 21. Jan 2006 23:00

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

Zitat von mh166
Hmm... Das ich das nich gemerkt hab liegt - wie ich gerade noch mal nachgeguckt hab - daran, dass ich bis jetzt immer von TObject "abgelitten" ;) (wie heißt das eigentlich richtig? :gruebel:) hab. Und das hat gar keine Free-Procedure. Aber mein inherited; hat er bis jetzt immer anstandslos akzeptiert. :lol:

Inherited kann in jeder Methode stehen. Wenn es keine Vorfahr-Methode gibt, passiert eben nichts.
Übrigens steht in der System.pas:
Delphi-Quellcode:
procedure TObject.Free;
begin
  if Self <> nil then
    Destroy;
end;
Ist also wohl doch in TObject definiert.

Gruß
xaromz

DevilsCamp 22. Jan 2006 00:11

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

Zitat von mh166
Hmm... Das ich das nich gemerkt hab liegt - wie ich gerade noch mal nachgeguckt hab - daran, dass ich bis jetzt immer von TObject "abgelitten" ;) (wie heißt das eigentlich richtig? :gruebel:) hab. Und das hat gar keine Free-Procedure.
mfg, mh166

Doch hat es...

Khabarakh 22. Jan 2006 11:40

Re: inherited Free; <-- warum kommt da eine exeption?!
 
Du hast wohl TObject.Free nur überdeckt (was fatale Auswirkungen haben kann) und nicht überschrieben. Letzteres ist wie gesagt nicht möglich und wird mit einem Compilerfehler quittiert.

mh166 22. Jan 2006 16:00

Re: inherited Free; <-- warum kommt da eine exeption?!
 
Naja, nun weiß ichs und gelobe Besserung. :angel2: :lol:

mfg, mh166


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 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 by Thomas Breitkreuz