![]() |
[FIXED] Streams & Speicherleck
Hallo @ all,
ich arbeite zur Zeit an einem sehr Umfangreichen Projekt und habe ein kleines Problem: In einer Unit, Variables, habe ich sämtliche Globale Variablen gespeichert, darunter auch 3 MemoryStreams. Im Laufe des Programms werden diese Mehrfach mit *.Free und *:=TMemoryStream.Create frisch erzeugt. Dabei entsteht jedoch, laut MemCheck ein Speicherloch, ich habe allerdings keine Ahnung warum. Ich bin ein etwas *komischer* programmiere, ich hab einigermaßen Ahnung, aber dann doch wieder nicht, sprich ich arbeite mit einer Materie die mir Fremd ist, also bitte nicht hauen *au*. Kleines Beispiel:
Delphi-Quellcode:
unit Variables
... ... var teststream : TMemoryStream ... ...
Delphi-Quellcode:
Diese Prozedur Test wird mehrfach aufgerufen und produziert ab dem 2. Aufruf ein Speicherleck.
unit testunit
... ... procedure test var testbyte : byte; begin Variables.teststream := TMemoryStream.Create; testbyte := 255; Variables.teststream.write(testbyte,1); Variables.teststream.Free; end; Jetzt die Frage an euch: 1. Warum gibts hier ein Leck? 2. Wie kann ich meinen Stream recyclen? Vielen Dank schon im voraus, Markus |
Re: Streams & Speicherleck
Hallo Markus,
ich habe das Speicherleck jetzt nicht nachvollzogen, aber grundsätzlich: du musst den Stream ja nicht ständig neu erschaffen, wenn er schon global ist. Es sollte doch reichen, wenn du seine Eigenschaft Size auf 0 setzt. Grüße vom marabu |
Re: Streams & Speicherleck
Danke, der Trick funktioniert ... jetzt bemängelt er nur noch die erste Erzeugung des Streams, da ich sämtliche Streams am Anfang des Programms erzeuge ... das ist echt komisch ...
Ich bau mal noch ein wenig um, mal sehen obs dann besser wird ... mfG Markus EDIT: Im Programm selbst bemängelt er nichts, aber bei der Initialisierung ... Mein Programmaufbau: Unit Variables enthält eine Prozedur INIT, die alle Streams erzeugt ... nach der neuen Programmversion werden diese erst mit Free aufgelöst, wenn das Programm beendet. Dazwischen greifen diverse Prozefuren auf den Stream zu. Könnte es evtl. daran liegen, dass ich eine Funktion auf den Stream zugreifen lasse? also
Delphi-Quellcode:
ich glaub, ich muss nochmal meinen Quellcode checken ...
stream := gibstreamzurück(somestrings);
EDIT2: Das ist die Lösung !!! Meine Funktion erzeugt intern einen neuen Stream und überschreibt mir den alten --> Speicherleck |
Re: [FIXED] Streams & Speicherleck
Moin Markus,
für solche Intialisierungen kannst Du auch den Initialization- und Finalization-Abschnitt der Unit benutzen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:56 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