Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [FIXED] Streams & Speicherleck (https://www.delphipraxis.net/63989-%5Bfixed%5D-streams-speicherleck.html)

markusj 25. Feb 2006 19:12


[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:
unit testunit
...
...
procedure test
var testbyte : byte;
begin
Variables.teststream := TMemoryStream.Create;
testbyte := 255;
Variables.teststream.write(testbyte,1);
Variables.teststream.Free;
end;
Diese Prozedur Test wird mehrfach aufgerufen und produziert ab dem 2. Aufruf ein Speicherleck.

Jetzt die Frage an euch:
1. Warum gibts hier ein Leck?
2. Wie kann ich meinen Stream recyclen?

Vielen Dank schon im voraus,

Markus

marabu 25. Feb 2006 20:08

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

markusj 25. Feb 2006 20:23

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:
stream := gibstreamzurück(somestrings);
ich glaub, ich muss nochmal meinen Quellcode checken ...


EDIT2: Das ist die Lösung !!! Meine Funktion erzeugt intern einen neuen Stream und überschreibt mir den alten --> Speicherleck

Christian Seehase 25. Feb 2006 21:52

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