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 Den Leak bei rekursiven Closures bekämpfen (https://www.delphipraxis.net/189662-den-leak-bei-rekursiven-closures-bekaempfen.html)

Mavarik 7. Jul 2016 12:02

AW: Den Leak bei rekursiven Closures bekämpfen
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1342143)
Zitat:

Zitat von Mavarik (Beitrag 1342138)
Delphi-Quellcode:
                   IPrinter := NIL;

Frank! Aufwachen! :hello:

Ja ja

Delphi-Quellcode:
                   myPrinter := NIL;

Der schöne Günther 7. Jul 2016 12:11

AW: Den Leak bei rekursiven Closures bekämpfen
 
Das mit dem IPrinter sollte nur verdeutlichen dass wir es u.U. nicht nur mit ein paar Byte für die Closure sondern evtl. mit richtig dicken Brocken zu tun haben ;-)

Ich bedanke mich noch einmal ganz herzlich bei allen :thumb:

Ich hatte gestern wohl einen schlechten Tag und irgendwie übersehen dass das explizite "Nil-Setzen" der Variable Abhilfe schafft.


Da ich keinen Assembler verstehe musste ich es zwar zwei, drei mal lesen, aber ich glaube ich habe es jetzt verstanden. Dieses implizit erstellte "Etwas" scheint demnach die Closure nur als Zeiger zu referenzieren oder weshalb ruft er kein IntfClear darauf auf wenn er selber platt gemacht wird? Vielleicht sollte man das ändern?

Stevie 7. Jul 2016 12:31

AW: Den Leak bei rekursiven Closures bekämpfen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Der schöne Günther (Beitrag 1342153)
Dieses implizit erstellte "Etwas" scheint demnach die Closure nur als Zeiger zu referenzieren oder weshalb ruft er kein IntfClear darauf auf wenn er selber platt gemacht wird? Vielleicht sollte man das ändern?

Weil gecapturte Variablen Felder der durch den Compiler generierten Klasse hinter der anonymen Methode sind und keine lokale auf dem Stack liegenden Variablen.
Das ist übrigens auch der Grund, warum man die nicht mehr mit dem Debugger anschauen kann - dem wurde das nämlich scheinbar niemals beigebracht.
Innerhalb der anonymen Methode allerdings kann man sie sehen und dort sieht man auch, dass es sich um ein Objekt handelt:

http://www.delphipraxis.net/attachme...1&d=1467891203

Dementsprechend werden diese Felder auch niemals beim end einer Methode angefasst/finalized. Denn die anonyme Methode könnte ja noch weiter leben.
Um das festzustellen, müsste der Compiler eine eher komplexe Analyse des Codes durchführen. Eventuell wäre das aber etwas, was man Roman für FixInsight mal vorschlagen könnte.


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