Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Objekt].Free Frage (https://www.delphipraxis.net/25427-%5Bobjekt%5D-free-frage.html)

CReber 6. Jul 2004 12:15


[Objekt].Free Frage
 
Kann man sich das [Objekt].Free eigentlich sparen wenn man die procedure eh beendet? Soll heißen

Delphi-Quellcode:
  if EP > 0 then
    Mache das...
  else
    begin
      regist.free; < - Kann man sich das sparen?
      Exit;
    end;
  regist.CloseKey;
Die Frage ist rein Quelltextkürzend gemeint ;) Weil somit würde ich ja 3 Zeilen Quellcode einsparen und das summiert sich ja....

// WICHTIG !

Das ist eine Timer Procedure ! Soll heißen die wird immer wieder aufgerufen aber regist wird im falle eines falles nie freigegeben...

Jens Schumann 6. Jul 2004 12:23

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

bttb930 6. Jul 2004 12:25

Re: [Objekt].Free Frage
 
objekte werden nicht automatisch beim verlassen einer prozedur frei gegeben. also mußt du sie freigeben.

Christian Seehase 6. Jul 2004 12:44

Re: [Objekt].Free Frage
 
Moin Jens,

Zitat:

Zitat von Jens Schumann
Wenn der Gültigkeitsbereich der Instanzenvariabelen verlassen wird, wird der Referenzzähler automatisch dekrementiert.

nach allem was ich bislang dazu gelesen habe, gibt es allerdings selbst hier Ausnahmen.

sakura 6. Jul 2004 12:46

Re: [Objekt].Free Frage
 
Zitat:

Zitat von Christian Seehase
nach allem was ich bislang dazu gelesen habe, gibt es allerdings selbst hier Ausnahmen.

Gib mal bitte eine Deiner Quellen an :shock:

...:cat:...

Jens Schumann 6. Jul 2004 12:47

Re: [Objekt].Free Frage
 
Zitat:

Zitat von Christian Seehase
Moin Jens,

Zitat:

Zitat von Jens Schumann
Wenn der Gültigkeitsbereich der Instanzenvariabelen verlassen wird, wird der Referenzzähler automatisch dekrementiert.

nach allem was ich bislang dazu gelesen habe, gibt es allerdings selbst hier Ausnahmen.

Ja stimmt. Habe ich in den Büchern von A. Kosch gelesen. Ich glaube zu erinnern (habe die Bücher z.Z. nicht dabei) das es mit const in einer Parameterübergabe zusammenhängt.

Christian Seehase 6. Jul 2004 12:48

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.

neolithos 6. Jul 2004 12:57

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;

choose 7. Jul 2004 22:55

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:
procedure UsesRefCount(AnObject: IInterface);
procedure IgnoresRefCount(const AnObject: IInterface);
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.
Delphi-Quellcode:
var
  myObject: TInterfacedObject;
begin
  myObject := TInterfacedObject.Create;
  UsesRefCount(myObject);
  // myObject is still<>nil but already freed
  // myObject.Free could cause an error!
gegenüber der Variante 2
Delphi-Quellcode:
var
  myObject: TInterfacedObject;
begin
  myObject := TInterfacedObject.Create;
  try
    IgnoreRefCount(myObject);
    // myObject is untouched and has to be freed!
  finally
    FreeAndNil(myObject);
  end;
Selbiges gilt auch für Strings wobei dies keinen weiteren Eingriff seitens des Programmierers erfordert...

Dani 8. Jul 2004 00:30

Re: [Objekt].Free Frage
 
Zitat:

Das ist eine Timer Procedure ! Soll heißen die wird immer wieder aufgerufen aber regist wird im falle eines falles nie freigegeben...
Wäre es dann nicht besser, wenn du die Variable einfach in die Private/Public Deklarationen deiner Form packst und sie erst freigibst, wenn du sie absolut nicht mehr brauchst? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz