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


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:12 Uhr.
Seite 1 von 2  1 2      

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