Speicherleck Problem mit MDI

MFC openGL

Erfahrenes Mitglied
Hi Freunde des guten Geschmacks,

zunächst hätten wir hier mal ein Glas heiße Butter...Ne, im ernst jetzt, ich habe ein MDI Programm, welches Ständig das Aktive MDI ändert, und durch ein anderes Ersetzen soll.

Meine Funktion auf dem Button sieht so aus :


Code:
//aktuelle MDI Child

Form currentmdichild = new formArtikelsuchen();

 
 
public funktionx(...)
{
currentmdichild.Dispose(); 
this.IsMdiContainer = true;

currentmdichild = new formVerkaeufer();

currentmdichild.MdiParent = this;

currentmdichild.FormBorderStyle = FormBorderStyle.None;

currentmdichild.Show();

...}

Problem ist jetzt, wenn ich den Button X mal drücke, dann erhöht sich jedes mal im Taskmanager der benötigte Speicher um ein wenig, aber nach ca 30 mal sind das schon 10MB :(
Für mich sieht das nach einem Leck aus, aber ich weiß nicht wieso, ich zerstöre das vorherige, aktive Objekt ja mit dispose, und erst dann kommt das neue...

Need help !

Gruss und Danke schonmal für eure Vorschläge und Anregungen

MFC OpenGL
 
Sind in der Formklasse vielleicht Objekte die nicht mit Disposed werden?

Grundsätzlich ist es nicht steuerbar wann der Garbage Collector wirklich aufräumt.
Dispose markiert ja nur die Objekte zum Aufräumen und löst Referenzen auf, was den Garbage Collector Arbeit erspart.
Soweit ich mich erinnere legt der Garbage Collector zufällig los oder wenn der Speicher wirklich knapp wird.
 
Nein, an das Form selbst habe ich schon gedacht, das macht momentan nix, ist fast leer und ohne Funktionen. Daran kann es also nicht liegen.

Ich meine, Ok, wenn ich SICHER sein kann das dadurch nicht nach 20 Stunden Betrieb das Programm abschmiert, weil vor dem Speichermangel doch der GC aufgerufen wird, dann wäre mir das egal.

Aber wenn das nicht sicher ist, dann hab ich dabei einen potenziellen Bug, und ich kann ja kein Tool verkaufen, was nach 20 Clicks ca 10MB mehr speicher verbraucht, dann müsste ich ne 200GB HDD spendieren, für ne Auslagerungsdatei ;)

Und es gibt wirklich keine Möglichkeit den GC manuell auszulösen ? Dann könnte ich das ja mal testen.

Und ansonsten, mein Code hat doch keine potenzielle Lücke bisher, oder wie seht ihr das ?
Oder stimmt evtl was mit meinem MDI nicht ?


Gruss

MFC OpenGL
 
Hi,

also du kannst schon den GarbageCollector sagen, dass er jetzt loslegen soll, dass muss aber nicht heißen, dass er alles auch wegräumt (siehe GC.Collect())
Bezgl. Memory Leaks:
Ich hab mir nicht alles durchgelesen und die VErweise angeschaut, aber vielleicht hilft dir das ja weiter
 
Hmmm,

also hab das eben mal mit GC.Collect() probiert, aber der Speicher steigt trotzdem super schnell an ;(
Ich werde Montag mal mit einem Profiler das Programm checken, trotzdem erstmal danke.

Gruss

MFC OpenGL
 
ah, moment.

kann es sein, dass du eine Ringreferenz hast?
du weiß ja dem mdichild auch den Parent zu. Und da dieser aber noch da ist, wenn du Dispose() aufrufst, kann das Objekt nicht vollständig weggeräumt werden.
Versuch doch mal vor Dispose den Parent auf null zu setzen.
 
Habe das eben mal ausprobiert, den Parent vorher auf null zu setzen, geht aber auch nicht. Eher im Gegensatz, wird dadurch nur noch schlimmer, der Speicherhunger pro Click wird auf über 200kb / Klick erhöht ;(


Habt ihr das mit den MDI's evtl anders gelößt, könntet ihr mir dann dafür mal nen Bespiel posten, wenn das so ist ?

Habe gehört es gibt sogenannte Profiler, die nach Speicherlecks suchen, und angeblich soll bei .NET 2003 einer dabei sein, kann mir einer sagen wo ich den finde/wie der heißt ?

Gruß und Danke

MFC OpenGL
 
Hat außer mir sonst noch keiner mal nen MDI erstellt ? Wie habt ihr das dann gemacht, genauso wie ich ? Wo ist mein Speicherfehler ? :(
Gruss

MFC OpenGL
 
Hallo MFC openGL!
MFC openGL hat gesagt.:
Wo ist mein Speicherfehler ? :(
Bestimmt beim zigmalen neu instanzieren der MDI Childs.
Den GC händisch anzukurbeln kann auch in manchen Fällen fatal sein.

Das ganze sieht für mich nach einer Art Verkaufs/Bestandssoftware aus.
Ich denke nicht das Du jedes einzelne Form in zig varianten neu instanziert werden muss, oder?
Leg sie in einem ControlArray ab. Eine Funktion, der Du den Typ des gewünschen MDI Childs mitgibst,
könnte dann zB das gewünschte MDI Child anzeigen.
Letzendlich hast ja eh irgendwelche Funktionen in deinen MDI Childs implementiert,
denen Du die Daten übergibst, welche angezeigt werden sollen.
Versuch also alles wiederzuverwenden, sofern Du es nicht mehrmals brauchst.
Du weisst schon... ;)

MfG, cosmo
 

Neue Beiträge

Zurück