Merkwürdiges Memoryleak
Hallo, habe seit einiger Zeit ein merkwürdiges Memoryleak das ich nicht erklären kann. Es passiert bei der
Übergabe des Textinhaltes einer TEdit-Komponente an eine Funktion, welche den String in einem Array ablegt.
Grob gesagt: Ich habe ein Formular mit einem TEdit und einem Button. Wenn der Button gedrückt wird, dann
wird eine Funktion aufgerufen, an welche der Inhalt des TEdit übergeben wird:
uebergebe(txtEdit.text);
In der Funktion wird dann der übergebene String in einem String Array
sDaten[1..1000] of string;
an der ersten freien Stelle abgelegt. Das Array ist in einer anderen Unit definiert. Wenn ich jetzt den
Button drücke und dann das Formular schliesse entsteht das Memoryleak.
Interessant ist, das wenn ich der Funktion anstatt "txtEdit.text" einfach nur 'bla' übergebe, es dann kein
Memoryleak gibt. Kann sich jemand vorstellen, woran das liegen kann?
Mfg
Sven Gallin
Merkwürdiges Memoryleak
-
- Beiträge: 73
- Registriert: Fr 28. Mai 2010, 08:39
- OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
- CPU-Target: 32Bit
- Wohnort: Heidelberg
Merkwürdiges Memoryleak
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)
(Yoda zu Dooku)
Re: Merkwürdiges Memoryleak
Woran erkennst du denn das Memoryleak? Heaptrc?
-
- Beiträge: 73
- Registriert: Fr 28. Mai 2010, 08:39
- OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
- CPU-Target: 32Bit
- Wohnort: Heidelberg
Re: Merkwürdiges Memoryleak
Ja, Heaptrc sagt mir das. Es ist wirklick komisch, ich programmiere jetzt seit zig Jahren in Lazarus/Freepascal, aber sowas ist mir bisher nicht passiert. Vorallem wo Parameterübergaben doch 0815-Standart sind. Naja, offensichtlich wohl nicht.
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)
(Yoda zu Dooku)
Re: Merkwürdiges Memoryleak
Kannst du das Problem isolieren und das minimale Projekt hochladen? Ich fürchte, dass man sonst nicht viel dazu sagen kann.
-
- Beiträge: 73
- Registriert: Fr 28. Mai 2010, 08:39
- OS, Lazarus, FPC: Win7 64bit, Lazarus 1.6.0 32bit (FPC 3.0.0)
- CPU-Target: 32Bit
- Wohnort: Heidelberg
Re: Merkwürdiges Memoryleak
Hab das Problem lösen können. Es war wieder ein "ich wollte schlau sein" Fehler. Hatte in meinem Projekt erstmalig mit verstärktmit dynamischer Speicherreservierung gearbeitet und alle möglichen Bereiche dann mit FillByte mit 0 initialisiert. Irgentwie bin ich dann wohl auf die Idee gekommen, das auch
mit meinem String-Array
sDaten[1..1000] of string;
zu machen, das ich erwähnte. Also
FillByte(sDaten, 1000, 0);
Das war der Fehler. Ich habe das weggelassen und das einfach über eine zusätzliche Variable gelösst, welche die Anzahl der gerade in der Liste vorhandenen Elemente speichert. Wenn die Variable 0 ist, dann gilt die Liste als leer usw.. Jetzt ist das Memleak weg. Ich denke auch, ich weiss warum:
Ich habe durch das FillByte die 1000 Zeiger überschrieben und damit verwaiste Speicherbereiche erzeugt die keinen Bezug mehr hatten. Wenn ich auf dem üblichen Weg vorgegangen wäre: "sDaten[1]:='''" dann hätte Lazarus erkennen können, das ein Zeiger gelöscht wird( durch Neuzuweisung mit einem anderen) und hätte dann, wenn es keine weiteren Referenzen dieses Zeigers gibt, den Speicher freigeben können. So aber konnte dieses System nicht greifen, da er nichts davon mitbekommen hat.
Mfg
mit meinem String-Array
sDaten[1..1000] of string;
zu machen, das ich erwähnte. Also
FillByte(sDaten, 1000, 0);
Das war der Fehler. Ich habe das weggelassen und das einfach über eine zusätzliche Variable gelösst, welche die Anzahl der gerade in der Liste vorhandenen Elemente speichert. Wenn die Variable 0 ist, dann gilt die Liste als leer usw.. Jetzt ist das Memleak weg. Ich denke auch, ich weiss warum:
Ich habe durch das FillByte die 1000 Zeiger überschrieben und damit verwaiste Speicherbereiche erzeugt die keinen Bezug mehr hatten. Wenn ich auf dem üblichen Weg vorgegangen wäre: "sDaten[1]:='''" dann hätte Lazarus erkennen können, das ein Zeiger gelöscht wird( durch Neuzuweisung mit einem anderen) und hätte dann, wenn es keine weiteren Referenzen dieses Zeigers gibt, den Speicher freigeben können. So aber konnte dieses System nicht greifen, da er nichts davon mitbekommen hat.
Mfg
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)
(Yoda zu Dooku)