![]() |
[Objekt].Free Frage
Kann man sich das [Objekt].Free eigentlich sparen wenn man die procedure eh beendet? Soll heißen
Delphi-Quellcode:
Die Frage ist rein Quelltextkürzend gemeint ;) Weil somit würde ich ja 3 Zeilen Quellcode einsparen und das summiert sich ja....
if EP > 0 then
Mache das... else begin regist.free; < - Kann man sich das sparen? Exit; end; regist.CloseKey; // WICHTIG ! Das ist eine Timer Procedure ! Soll heißen die wird immer wieder aufgerufen aber regist wird im falle eines falles nie freigegeben... |
Re: [Objekt].Free Frage
NEIN
Ausnahme: COM Objekte. Die sind mit einem Referenzzähler behaftet. Wenn der Gültigkeitsbereich der Instanzenvariabelen verlassen wird, wird der Referenzzähler automatisch dekrementiert. Ist der Referenzzähler bei 0 angekommen wird das COM Objekt freigegeben. Wenn ich das richtig verstanden habe liegt die Freigabe aber bei Windows. Stichwort: oleaut32.dll |
Re: [Objekt].Free Frage
objekte werden nicht automatisch beim verlassen einer prozedur frei gegeben. also mußt du sie freigeben.
|
Re: [Objekt].Free Frage
Moin Jens,
Zitat:
|
Re: [Objekt].Free Frage
Zitat:
...:cat:... |
Re: [Objekt].Free Frage
Zitat:
|
Re: [Objekt].Free Frage
Moin sakura,
COM/DCOM/COM+ mit Delphi, von Andreas Kosch. Eine präzise Angabe an welcher Stelle, muss ich Dir allerdings vorerst mal schuldig bleiben, die müsste ich erst noch raussuchen. |
Re: [Objekt].Free Frage
tipp:
Delphi-Quellcode:
with T???.Create do
try if func(dasnf) then Exit; // --> gehe zum Finally-Block mach weiteres finally Free; end; |
Re: [Objekt].Free Frage
Hallo Christian,
ich habe jenen Titel (lediglich den Vorgänger) von Herrn Kosch leider nicht gelesen, kann aber bestätigen, dass der Delphicompiler bei einem const Paramter keinen Code zur Referenzzählung und den damit verbundenen impliziten Try/Finally-Block generiert. Dies kann uU einige Nebeneffekte haben, wenn man sich Signaturen der Art
Delphi-Quellcode:
ansieht. Sollte man jene Routinen mit Objekten aufrufen, bei denen der Referenzzähler zuvor null betrug, gibt die erste Variante das Objekt selbsständig frei und die vorherige Referenz ist ungültig während die zweite Variante die Verantwortlichkeit des Speicherfreigabe dem Klienten überlässt.
procedure UsesRefCount(AnObject: IInterface);
procedure IgnoresRefCount(const AnObject: IInterface);
Delphi-Quellcode:
gegenüber der Variante 2
var
myObject: TInterfacedObject; begin myObject := TInterfacedObject.Create; UsesRefCount(myObject); // myObject is still<>nil but already freed // myObject.Free could cause an error!
Delphi-Quellcode:
Selbiges gilt auch für Strings wobei dies keinen weiteren Eingriff seitens des Programmierers erfordert...
var
myObject: TInterfacedObject; begin myObject := TInterfacedObject.Create; try IgnoreRefCount(myObject); // myObject is untouched and has to be freed! finally FreeAndNil(myObject); end; |
Re: [Objekt].Free Frage
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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