![]() |
Memory Leak durch Thread?
Hallo,
ich glaube, ich habe ein Memoryleak programmiert und ich weiß nicht warum. Ich habe ein Threadobjekt, welches vom Haupt-VCL Programm erzeugt und gestartet, beendet und wieder vernichtet wird. Nach Vernichtung des Threadobjekts zeigt der Taskmanager für mein Programm mehr Speicherverbrauch an als vor der Erzeugung. Hier der prinzipielle Ablauf:
Delphi-Quellcode:
Das Ganze lässt sich auch wiederholen. Nach jedem Threadlauf wächst der Speicherbedarf weiter an.
Capture := TCapture.Create(false);
...warte auf ein Ereignis, dann Capture.Terminate; setze alle dynamischen Objekte in Capture auf Länge 0. Capture.Destroy; Hat jemand nen Tipp für mich? Gruß, Thomas |
Re: Memory leak?
1. Man ruft Free anstatt Destroy auf. Dürfte aber nicht viel ändern.
2. Der Taskmanager ist erstens ungenau und zweitens weis der eh nicht, was gerade dein Speichermanager macht. Dein Speichermanager reserviert mal schnell einen 4kB Block auch wenn du nur ein Byte brauchst und gibt den Block erst am Ende des Programms wieder frei (er ist besser organisiert, als es jetzt klingt). 3. Versuche deswegen mal bei deinem Speichermanager nachzufragen (getHeapStatus) oder nutze FastMM der deinen Speicher überwacht. Wenn du dann immer noch Speicherlöcher findest, dann erst tiefer ins Programm schauen. |
Aussagekräftiger Titel
Bitte gib deinem Beitrag einen aussagekräftigen Titel. Der jetzige Titel lässt nicht erkennen, um was für ein Problem oder Frage es sich handelt. Um den Titel zu ändern, editiere einfach deinen ersten Beitrag. Damit erleichterst du das Auffinden deines Beitrages mit der Suche und ersparst anderen Mitglieder ein unnötiges Öffnen deines Beitrages.
|
Re: Memory leak?
Delphi-Quellcode:
das kann alles mögliche bedeuten
setze alle dynamischen Objekte in Capture auf Länge 0.
und meine :glaskugel: sagt: so hab ich keinen Tipp das mit dem Destroy steht sogar in der OH drinnen meine OH sagt (TObject.Destroy) Rufen Sie Destroy nicht direkt auf. Verwenden Sie stattdessen Free. Die Methode Free überprüft, ob die Objekt-Referenz nicht bereits nil ist und ruft Destroy nur bei Bedarf auf. |
Re: Memory Leak durch Thread?
Zitat:
Ich habe definitiv ein Speicherleck. Jeder Threaddurchlauf erhöht das Prozessmemory um 8k, mit GetProcessMemoryInfo im Programm verifiziert. Hat jemand nen Tipp, wie man den Übeltäter strategisch einkreisen könnte? |
Re: Memory Leak durch Thread?
Was legst du in den dynamischen Strukturen ab?
|
Re: Memory Leak durch Thread?
Zitat:
|
Re: Memory Leak durch Thread?
Das SetLength() löscht zwar das dynamische Array aber nicht die TCapture(?) Strukturen, die darin verwaltet werden.
|
Re: Memory Leak durch Thread?
Meine dynamischen Felder enthalten nur Chars, keine Strukturen.
Die TCapture-Thread-Struktur sollte doch eigentlich mit Capture.Free gelöscht werden.??? |
Re: Memory Leak durch Thread?
Guten Abend,
hast Du schon ![]() ob Du wirklich ein Leck hast. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:37 Uhr. |
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