Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Klassen freigeben


HenryHux - Di 01.02.11 19:01
Titel: Klassen freigeben
Hey, ich habe bis jetzt immer die Exception invalid Pointer bekommen, wenn ich den constructor so aufgerufen habe.

Delphi-Quelltext
1:
2:
3:
4:
5:
destructor TReactions.free;
begin
  AndereKlasse.Free;
  inherited free;
end;


Wenn ich anstatt inherited free inherited destroy aufrufe, kommt keine Exception.
Deshalb wollte ich mal fragen, wie ich denn am besten Klassen wieder freigebe.
Wähle ich dazu den destructor free oder destroy?
Und rufe ich inherited free oder destroy auf?
Wo liegt der Unterschied zwischen free und destroy?
Ich meine mal gelesen zu haben dass free destroy aufruft??

Lg


elundril - Di 01.02.11 19:04

das free nach dem inherited brauchst du eigentlich gar nicht. wenn du nur inherited schreibst dann nimmt er automatisch die gleiche methode aus der elternklasse.

Außerdem rufst du immer Free auf, wenn du ein Object freigibst. Das macht nämlich ein bisschen mehr als Destroy und ruft nach dem "mehr machen" intern auch destroy auf.

siehe dazu das Delphi-Wikibook [http://de.wikibooks.org/wiki/Programmierkurs:_Delphi:_Pascal:_Konstruktoren_und_Destruktoren#Richtige_Verwendung_von_Free_und_Destroy]

lg elundril


jaenicke - Di 01.02.11 20:29

Also:
Free ist eine Prozedur, die prüft, ob die Instanz bereits nil ist (also gar nicht oder nicht mehr existiert). Wenn nicht, wird der Destruktor aufgerufen. Der sollte grundsätzlich Destroy heißen. (Auch wenn man ihn theoretisch auch anders nennen kann. :puke:)

Dann schauen wir doch mal:
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Hey, ich habe bis jetzt immer die Exception invalid Pointer bekommen, wenn ich den constructor so aufgerufen habe.

Delphi-Quelltext
1:
destructor TReactions.free;                    
Du deklarierst hier einen Destruktor, der genauso heißt wie die Prozedur Free. Wenn du jetzt das geerbte Free aufrufst, ruft das wiederum den Destruktor auf. Nur ist das bei dir dein Free. Das wird also selbst wieder aufgerufen. :nut:

Deshalb:
Erstens heißt ein Destruktor immer Destroy (und der Konstruktor Create).
Zweitens sollte dieser nie direkt aufgerufen werden, sondern stattdessen Free (steht auch in der Hilfe).
Und drittens solltest du Free nicht überschreiben, es sei denn du weißt warum du das willst.