![]() |
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")? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:40 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