Merkwürdiges Memoryleak

Rund um die LCL und andere Komponenten
Antworten
Leberecht
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

Beitrag von Leberecht »

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
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: Merkwürdiges Memoryleak

Beitrag von theo »

Woran erkennst du denn das Memoryleak? Heaptrc?

Leberecht
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

Beitrag von Leberecht »

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)

Benutzeravatar
theo
Beiträge: 10905
Registriert: Mo 11. Sep 2006, 19:01

Re: Merkwürdiges Memoryleak

Beitrag von theo »

Kannst du das Problem isolieren und das minimale Projekt hochladen? Ich fürchte, dass man sonst nicht viel dazu sagen kann.

Leberecht
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

Beitrag von Leberecht »

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
„Viel zu lernen du noch hast.“
(Yoda zu Dooku)

Antworten