![]() |
Wann .Free und wann .Destoy benutzen
Hallo,
habe eine Frage zur Benutzung des Destuktors meiner Klasse. ich kann ja folgendes schreiben:
Delphi-Quellcode:
oder ich rufe den von mir erstellten Destructor
meinObjekt.Free;
Delphi-Quellcode:
auf...
meinObjekt.Destroy;
Gut meine Frage nun, was macht .Free? Setzt free nur die Objektreferenz auf NULL? Oder ruft Free auf den Destruktor auf? Danke schonmal |
Re: Wann .Free und wann .Destoy benutzen
|
Re: Wann .Free und wann .Destoy benutzen
Nimm .Free. Hier werden verschiedene Test durchgeführt und dann .Destroy aufgerufen. man sollte .Destroy nie manuell aufrufen.
|
Re: Wann .Free und wann .Destoy benutzen
Danke,
war genau das was ich gesucht habe!! Weiß jetzt auch wo mein Fehler war,.. habe in meine Klasse den Destruktor nicht überschrieben, demzufolge wurde er auch nie aufgerufen... Danke! |
Re: Wann .Free und wann .Destoy benutzen
also ist
Delphi-Quellcode:
das gleiche wie
XYZ.Free
Delphi-Quellcode:
?
if XYZ <> nil then XYZ.Destroy
|
Re: Wann .Free und wann .Destoy benutzen
Zitat:
...:cat:... |
Re: Wann .Free und wann .Destoy benutzen
Ja :
Zitat:
|
Re: Wann .Free und wann .Destoy benutzen
Zitat:
|
Re: Wann .Free und wann .Destoy benutzen
Zitat:
|
Re: Wann .Free und wann .Destoy benutzen
Zitat:
|
Re: Wann .Free und wann .Destoy benutzen
Zitat:
Der Compiler muss halt einfach einmal mehr mitdenken und beim Aufruf von free die self-varaible als Referenz übergeben. |
Re: Wann .Free und wann .Destoy benutzen
Hallo,
Zitat:
Delphi-Quellcode:
Angenommen, Free setzt A auf nil, welchen Wert hat dann B?
var
A, B: TObject; begin A := TObject.Create; B := A; A.Free; end; Gruß xaromz |
Re: Wann .Free und wann .Destoy benutzen
Er müsste erkennen, daß eine Variable außerhalb des Scopes der Klasse die gerade freigegebene Instanz referenziert und diese dann auf Nil setzen.
|
Re: Wann .Free und wann .Destoy benutzen
Hallo,
Zitat:
Gruß xaromz |
Re: Wann .Free und wann .Destoy benutzen
Zitat:
|
Re: Wann .Free und wann .Destoy benutzen
@xaromz: Das ist ja ne alberne Annahme. Was kann denn der Compiler dafür wenn ich mir irgendwo den Pointer auf ein Objekt noch ein zweites oder drittes Mal merke. auch freeandnil setzt bei dir B nicht auf nil. So kann ich (wenn auch etwas umständlicher wegen den Referenzzählern) auch strings etc."austrixen".
Dafür gibts eben Referenzzähler, und zack sind wir bei Interfaces angelangt. @mkinzler
Delphi-Quellcode:
Das ist Aufgabe des Compilers, da mal eine Referenz zu geben.
procedure Tobject.free(var self:Tobject);
begin if self<>nil then destroy self:=nil; end; |
Re: Wann .Free und wann .Destoy benutzen
Nur das das setzen von self auf nil unnötig ist, da nach dem Ende der Methode self nicht mehr existiert. Aber die variable, die das Objekt referenziert hat immer noch den Wert.
|
Re: Wann .Free und wann .Destoy benutzen
Hallo,
Zitat:
Zitat:
Delphi-Quellcode:
Das Beispiel wirkt konstruiert, aber ähnliche Codestücke findet man in der VCL.
TDemoClass = class
private ... public property Control: TWhateverClass read GetControl write SetControl; end; var Instance : TDemoClass; begin ... Instance.Control.Free; ... end; Ein automatisch generiertes "Instance.Control := nil" nach dem Aufruf der Free-Methode funktioniert nur, wenn der Setter dies geeignet verarbeitet. Welchen Code soll der Compiler erzeugen, wenn kein Setter vorhanden ist? Die Prozedur FreeAndNil ist ein einfaches Werkzeug, mit dessen Hilfe der Programmierer eine Instanz freigeben und eine zugehörige Referenz sicher löschen kann. Nur der Programmierer kann wissen, wann und wo das geschehen sollte, und ob eventuell weitere Referenzen existieren, die ebenfalls gelöscht werden müssen. Gruß Hawkeye |
Re: Wann .Free und wann .Destoy benutzen
Hallo,
Zitat:
Gruß xaromz |
Re: Wann .Free und wann .Destoy benutzen
Zitat:
Delphi-Quellcode:
@Hawkeye
var s:string;
begin //jetzt ist s nil s:='Hallo Welt'; //und jetzt zeigt s ganz woanders hin //ähnliches für dynamische Arrays end; Na du übergibst bei free "einfach" noch den zweiten Parameter mit, der auf nil gesetzt werden soll. Bei create wird ja auch noch vom Compiler die TypeInfo mitgeliefert. Es gibt noch weitere Funktionen (freemem/dispose), wo der Compiler einfach noch 1 Parameter mit anhängt. Und wenn du mit mehreren Referenzen auf ein Objekt arbeitest, dann nimm doch lieber ein Interface. Generell besteht bei sowas natürlich immer die Frage der Sinnfälligkeit. Aber wann brauch man denn nochmal einen Zeiger auf ein Objekt, dass nicht mehr existiert? Und wieviele Probleme diesbezüglich tauchten schon in der DP auf ("assigned funktoiniert nicht!" --> "Du musst den Zeiger auf nil setzen")? |
Re: Wann .Free und wann .Destoy benutzen
Hallo,
Zitat:
Zitat:
Zitat:
Gruß xaromz |
Re: Wann .Free und wann .Destoy benutzen
Hallo sirius,
ich bestreite nicht, daß ein wenig compiler magic in diesem Fall nützlich wäre. Ich wollte - genau wie xaromz - nur aufzeigen, daß es nicht in allen Fällen möglich sein wird, die notwendigen Befehle zum Löschen der Referenz(en) automatisch erzeugen zu lassen. Dies scheitert meiner Meinung nach spätestens dann, wenn die Referenz ein Funktionsergebnis ist. Ob es sinnvoll ist, so etwas zu programmieren, sei dahingestellt. Es kommt vor, deshalb muß ein Compiler auch diese Fälle berücksichtigen. Kann er diese Aufgabe aber nicht vollständig übernehmen, so daß ich als Programmierer gezwungen bin, in "schwierigen" Situation selbst tätig zu werden, dann trifft xaromz' Aussage auch für mich zu: In einer solchen Sprache möchte ich nicht programmieren. Zitat:
Gruß Hawkeye |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:12 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-2025 by Thomas Breitkreuz