Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Di 01.02.11 19:01 
Hey, ich habe bis jetzt immer die Exception invalid Pointer bekommen, wenn ich den constructor so aufgerufen habe.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.

Für diesen Beitrag haben gedankt: HenryHux
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
ausblenden 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.

Für diesen Beitrag haben gedankt: HenryHux