Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Token erst zum Programmende wieder freigaben? (https://www.delphipraxis.net/179139-token-erst-zum-programmende-wieder-freigaben.html)

CodeX 16. Feb 2014 23:40

Token erst zum Programmende wieder freigaben?
 
Ggf. lässt sich meine Frage auch ganz allgemein auf Pointer, Objekte etc. ausweiten. Aber ich formuliere das mal als konkreten Fall.

Grundsätzlich achte ich immer darauf, alles direkt nach der Verwendung wieder sauber freizugeben. Allerdings frage ich mich ob es in diesem Fall nicht auch etwas geschickter geht: Ich verwende in meiner Anwendung regelmäßig und an vielen Stellen ein bestimmtes Token (TJwSecurityToken), das sich während des gesamten Programmablaufs nicht ändert.

Muss ich dieses tatsächlich bei jeder Verwendung neu erzeugen und freigeben oder kann ich es auch einfach bei Initialisierung der Anwendung global erzeugen und es während der gesamten Programmausführungszeit nutzen?
Müsste das in dem Fall bei Programmende überhaupt noch manuell freigegeben werden oder wird es durch das Programmende ohnehin freigegeben?
Sollte es technisch i.O. sein, gibt es sonstige Nachteile, dies so zu handhaben?

himitsu 16. Feb 2014 23:48

AW: Token erst zum Programmende wieder freigaben?
 
Den finalization-Abschnit am Ende der Units kennst zu aber?

Einfach dort, wo die Variable für die globale Instanz rumliegt, diese am Ende freigeben.

CodeX 16. Feb 2014 23:58

AW: Token erst zum Programmende wieder freigaben?
 
Ja, kenne ich. :)
Meine Frage ist eher, ob etwas dagegenspricht, das so zu tun.
Bzw. als Nebenfrage, ob das manuelle Freigeben dann überhaupt notwendig ist, wenn bei Programmende ohnehin automatisch alles wieder freigegeben wird.

Luckie 17. Feb 2014 00:28

AW: Token erst zum Programmende wieder freigaben?
 
Es gehört zu einem sauberen Programmierstil, das auch wieder aufzuräumen, was man angelegt hat.

hathor 17. Feb 2014 03:44

AW: Token erst zum Programmende wieder freigaben?
 
Info:
http://jwscldoc.delphi-jedi.net/inde...rityToken.html

The token handle is closed on instance destroying if Shared is set to false.

Jasocul 17. Feb 2014 08:05

AW: Token erst zum Programmende wieder freigaben?
 
Zitat:

Zitat von Luckie (Beitrag 1248142)
Es gehört zu einem sauberen Programmierstil, das auch wieder aufzuräumen, was man angelegt hat.

Ganz besonders dann, wenn man sonst einen anderen Stil hat, wie in diesem Fall. CodeX hat ja geschrieben, dass alles nach der Benutzung sofort wieder freigegeben wird. Wenn man dann so eine Abweichung von seinem eigenen Standard hat und den Source nach längerer Zeit wieder ansieht, kommt man ins Grübeln, was (und warum) man da gemacht hat.

CodeX 17. Feb 2014 13:41

AW: Token erst zum Programmende wieder freigaben?
 
Vielen Dank für Eure Antworten!

Ich schlussfolgere:
1. Es ist OK, ein Token (Zeiger, Objekt, etc.) bei Programmstart global zu erzeugen, sodass er während der gesamten Ausführungszeit zur Verfügung steht.
2. Auch wenn bei Programmende alles, was erzeugt wurde, automatisch freigegeben wird, ist es stilistisch besser, dies im Finalization block selbst zu tun.

Sir Rufo 17. Feb 2014 13:55

AW: Token erst zum Programmende wieder freigaben?
 
Zitat:

Zitat von CodeX (Beitrag 1248207)
Vielen Dank für Eure Antworten!

Ich schlussfolgere:
1. Es ist OK, ein Token (Zeiger, Objekt, etc.) bei Programmstart global zu erzeugen, sodass er während der gesamten Ausführungszeit zur Verfügung steht.
2. Auch wenn bei Programmende alles, was erzeugt wurde, automatisch freigegeben wird, ist es stilistisch besser, dies im Finalization block selbst zu tun.

Eine Instanz wird immer dort freigegeben, wo diese auch erzeugt wird.
Delphi-Quellcode:
initialization
->
Delphi-Quellcode:
finalization
,
Delphi-Quellcode:
Create
->
Delphi-Quellcode:
Destroy
,
Delphi-Quellcode:
OnShow
->
Delphi-Quellcode:
OnClose
.

Ausnahmen bestehen nur dort, wo das Lifetime-Management delegiert wird.
Delphi-Quellcode:
TComponent.Create( AOwner ); // der Owner kümmert sich um die Freigabe
TObjectList.Add( TObject.Create ); // die Liste kümmert sich um die Freigabe, wenn OwnsObjects

var
  MyInterface : IInterface;
MyInterface := TInterfacedObject.Create; // der Referenzzähler kümmert sich um die Freigabe
Geht man anders vor, so sollte man ganz genau wissen was da gerade macht (Referenzen auf nil setzen)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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