Memory Leaks in Delphi
In Release 1 von Delphi 10.2 Tokyo tritt ein Problem bei Windows FireMonkey-Anwendungen auf. Im Quality Portal wurde hier von Memory Leaks in den entsprechenden Anwendungen berichtet. Ebenso hier auf Stackoverflow.
Das Problem liegt daran, dass die an Thread.CurrentThread.ForceQueue weitergegeben Callbacks in TStyledControl.KillResourceLink nicht ausgeführt werden können, weil die Anwendung geschlossen wird, bevor ein Thread diese behandeln kann. Der TThread-Klassendestruktor zerstört die Liste, die immer noch die unbehandelten Callbacks enthält. Vermutlich finden die Memory Leaks nicht während der Ausführung, sondern bei Beenden des Programms statt.
Stefan Glienke, der auch die Ursache des Problems fand, schlägt eine recht einfache Abhilfslösung vor: Durch das Aufrufen von CheckSynchonize aus System.Classes wartet die Anwendung auf die Ausführung der Cleanup Threads. Dabei wird eine kurze Synchronisierung bei kaum merkbarer Verzögerung ausgeführt.
Der entsprechende Code kann an verschiedene Stellen gesetzt werden. Der einfachste Platz dafür ist der finalization-Block im Hauptformular. Mit aktiviertem Memory-Leak-Reporting kann es folgendermaßen aussehen:
initialization ReportMemoryLeaksOnShutdown := true; finalization CheckSynchronize; |
Alternativ kann die Änderung auch in der dpr-Projektdatei vorgenommen werden. Dazu müssen System.SysUtils und System.Classes den Uses hinzugefügt werden. Der Code kann so aussehen:
uses System.StartUpCopy, System.SysUtils, System.Classes, FMX.Forms, ... ; {$R *.res} procedure DoneApplication; begin CheckSynchronize; end; begin AddExitProc(DoneApplication); Application.Initialize; ...; Application.Run; |
Mit CheckSynchronize kann dieses Problem zunächst behelfsweise behoben werden, bis ein offizieller Fix veröffentlicht wird.