Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Abfragen ob eine Variable oder die Referenz noch existiert (https://www.delphipraxis.net/100249-abfragen-ob-eine-variable-oder-die-referenz-noch-existiert.html)

Cyberaxx 25. Sep 2007 22:47

Re: Abfragen ob eine Variable oder die Referenz noch existie
 
Zitat:

Zitat von Muetze1
Da hilft auch try/finally, weil trotz Exit würde der finally Block durchlaufen und somit wäre kein Leck entstanden.

Ja jetzt wo du es sagst stimmt es schon hab ich halt verpatzt, bzw nicht weiter drüber nach gedacht, da dieser Teil noch nicht wirklich implementiert ist.

Lotto wäre ne Idee :D

Was würde passieren wenn ich es vorher nochmal als eine Lokale Variable setze?

Delphi-Quellcode:
var
  AClient: TClient;
begin
  if FClients.FindSocket(Socket, Index) then
    AClient := FClients.Client[Index];

  FreeandNil(AClient);
end;
[Edit]Ok vergiss den Teil, dann gibt es eine Exception in der Collection nehme ich an...[/Edit]

Muetze1 25. Sep 2007 23:01

Re: Abfragen ob eine Variable oder die Referenz noch existie
 
Es wäre komplett kein Unterschied. Delphi kennt keine auto-generated Copy Constructoren und somit hast du immer nur Zeiger auf die Objekte an sich. Somit ist es egal wie du den Aufruf des Destructors ausführst, es wird immer diese eine Instanz freigegeben. Die TCollection wie auch die lokale Variable oder AClient beinhalten immer nur die Adresse (sie ist intern ein Pointer) wo die Objektinstanz im Speicher liegt. Alle 3 zeigen auf einen Speicherbereich und wenn du diesen freigibst zeigen immernoch alle 3 Elemente auf diesen Speicherbereich (wo nichts mehr ist) und Zugriffe auf diese Elemente sind somit böse (eigentlich sollte man sofort was auf die Finger bekommen). Damit letzteres passiert, müssten die Adressen zurückgesetzt werden. Am besten eignet sich die Adresse 0 (nil), weil beim Zugriff auf solche Adressen werden vom Prozessor (durch die LDT/GDT) nicht erlaubt und er erzeugt eine entsprechende Ausnahme (endet bei uns in einer Exception) und wir bekommen eine entsprechende Meldung. Bei der ganzen Erklärung merkt man schon, dass es schwierig wird, alle Variablen welche auf ein und die gleiche Instanz zeigt, wieder ordentlich auf nil zu setzen, damit man mitbekommt ob die Instanz noch existiert. Zur Zeit hat noch ein anderer Threadersteller mit genau diesem Phänomen ein Problem.

Also: Welches Element du nun nimmst um es freizugeben: es ist immer nur eine Instanz da und die gibst du ja frei.

Kedariodakon 25. Sep 2007 23:49

Re: Abfragen ob eine Variable oder die Referenz noch existie
 
Ohne jetzt den ganzen Source gelesen zu haben, kann ich bei solchen Sachen einem nur das arbeiten mit Interfaces ans Herz legen...

Bye Christian

Cyberaxx 26. Sep 2007 06:50

Re: Abfragen ob eine Variable oder die Referenz noch existie
 
Hab nie wirklich etwas mit Interfaces gemacht und dein Satz gibt mir keinen wirklichen Ansatz warum ich dies tun sollte.
wäre nett wenn Du mit etwas mehr Informationen kommen würdest, warum ich Interfaces nutzen sollte.

Das einzige was mit in dem Projekt Sorgen bereitete war die Funktion des getrennten Benutzers.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Seite 2 von 2     12   

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