Mein Programm wird immer größer(RAM-Nutzung)
-
Hi all,
bei meinem aktuellen Projekt iBT habe ich eine Liste zum verwalten von einer variablen Anzahl von Fenstern.
Wird ein Fenster geschlossen wird erst "DestroyWindow" ausgeführt, im anschluss dann "free( [struct*] )", aber der Speicher wird (im Taskmanager nachgesehen) nicht freigegeben.Mein Programm beginnt mit 932K Steigt bei dem Erstellen des ersten Fensters auf 968K und bei dem Zerstören ist es dann bei ... 968K ? Ich erstelle ein zweites Fenster (ersteres ist schon geschlossen) und siehe da 976K....
Ich kann (im TABmodus) nur 1 Fenster gleichzeitig auf haben, also muss die gesamte Liste geschlossen und somit auch "gefreet" werden ehe ich ein zweites aufmache, sonst motzt das Programm...
Was mache cih falsch... malloc und dann folgt bei beenden doch free... CreatWindow wird zu DestroyWindow oder??
-
Was für eine Struktur gibst du denn beim Zerstören des Fensters frei? Wie sieht sie aus?
cheers, Swordfish
-
*Chupa Chups ... llllösch' mich*
-
Ist es wichtig wie die Struktur aussieht?
typedef struct _openTab{ HWND wnd; char title[256]; WNDPROC oldReWndProc; struct _openTab *next; } *pOpenTab, openTab;^^ das ist sie... da mach ich dann
DestroyWindow( openTab->wnd ); free(openTab);
-
Schon mal versucht, die free-ung vor der DestroyWindow aufzurufen?
-
Auja, sehr gute Idee und das gibt auch garantiert keinen Fehler!

-
lippoliv schrieb:
typedef struct _openTab{ HWND wnd; char title[256]; WNDPROC oldReWndProc; struct _openTab *next; } *pOpenTab, openTab;^^ das ist sie... da mach ich dann
DestroyWindow( openTab->wnd ); free(openTab);und das machst du für *alle*
_openTabs (_openTab->next->next->...)?cheers, Swordfish
PS: Gibst du alle eventuell in der WndProc verwendeten GDI-Handles frei?
-
Was sind GDI Hanldes?
Nein das mache ich nicht für alle, nur für einen, der der geschlossen werden soll.
Wenn ich das für alle mache, rufe ich immer die Selbe funktion auf und lösche quasi den ersten und häng den zeiger für den ersten vor dem löschen auf den Zweiten.
-
Was Handles sind, sollte man eigentlich wissen. Und GDI heißt Graphic Device Interface. Dazu gehört der DeviceContext (DC), auf den am häufigsten die Handles unter BeginPaint oder GetDC vergeben werden (hDC).
-
Elektronix schrieb:
Was Handles sind, sollte man eigentlich wissen. Und GDI heißt Graphic Device Interface. Dazu gehört der DeviceContext (DC), auf den am häufigsten die Handles unter BeginPaint oder GetDC vergeben werden (hDC).
Ja die verwende ich, und was Handles sind weiß ich auch

Nur wollte ich wissen was du mit "GDI Handles" meinst...Ok also ich habe mal gelesen das die Schreibweise
myHdc = BeginPaint( myWnd, &myPaint ); //zeichnen im Fenster { //malen }ein "free(myHdc)" erspart, anhand der Tatsache das mein Programm "wächst" schätze ich das ist falsch wa?
zum Zeichnen habe ich zwei "HDC" und ein "PAINTSTRUCT", was muss ich davon ?per free()? wieder freigeben?
-
Das "freehDC" nach BeginPaint wird Dir nicht erspart, sondern nur von EndPaint() übernommen. BeginPaint und EndPaint müssen immer zusammen stehen, genau wie GetDC und free(hDC).
Die Sache ist einfach die: Alles, was Du mit GetXX oder alloc/malloc o. ä. anforderst, muß mit free() wieder freigegeben werden. Wenn Du (wie im Eingangspost beschrieben) eine verkettete Liste hast, sind darin alle Elemente einzeln allociiert. Also müssen sie auch alle einzeln wieder freigegeben werden. Das bedeutet: erstes Elemen holen- Zeiger zwischenspeichern- Zeiger des nächsten Elementes holen- erstes Element freigeben- ersten Zeiger NULlen. Und so weiter, oder so ähnlich.
-
Ja geil.. Habe EndPaint eingebaut, und es ist shconmal langsamer geworden...
Muss ich die "char title[22];" auch freigeben? Weil da arbeite ich ja nich mit malloc.
Dass währe dann das letzte was mir auffallen würde.. xD
[edit]Danke auf jedenfall für deine Posts und deine Geduld xD

-
bei einem normalen array ohne malloc wird es automatisch nach lebensdauer entfernt
-
Gut dann muss ich nochmal alles durchgehen, wo ich ein free übersehe..
Danke für die Infos und eure Mühen.
-
Tip Visual Leak Detector hilft dir ungemein um Speicherlecks aufzudecken.
Achne warst du nicht der Typ der mit Notepad programmiert ...
-
Joa steht in meiner Sig... Aber wie gesagt nurnoch diesen und evtl. noch nächsten Monat...
-
lippoliv schrieb:
Joa steht in meiner Sig... Aber wie gesagt nurnoch diesen und evtl. noch nächsten Monat...
sry aber geh und holl dir einfach was gescheites, wirst merken was für einen unterschied ne gescheite ide macht<--mit paar addons

bin eig sehr zufrieden mit vc2008 professionell!
wobei haste irgendeine art debugger, dann einfach an bestimmten teilen des quellcodes stoppen und dabei kucken was der speicher macht. wenn er anwächst an einem haltepunkt muss das problem irgendwo im quellcode davor liegen.
-
phazz schrieb:
lippoliv schrieb:
Joa steht in meiner Sig... Aber wie gesagt nurnoch diesen und evtl. noch nächsten Monat...
sry aber geh und holl dir einfach was gescheites, wirst merken was für einen unterschied ne gescheite ide macht<--mit paar addons

bin eig sehr zufrieden mit vc2008 professionell!
wobei haste irgendeine art debugger, dann einfach an bestimmten teilen des quellcodes stoppen und dabei kucken was der speicher macht. wenn er anwächst an einem haltepunkt muss das problem irgendwo im quellcode davor liegen.
Ich kenne sowas alles, in der Schule nutzen wirs auch, aber ich sitze hier auf der Arbeit(Azubi halt) und kann nicht einfach nutzen was ich will xD
Sonst würd ich ja auch keine GUIs mit C machen sondern einfach C# oder so nutzen, wo ich mein Form sehe, bevor ich compiliere xD
Danke trotzdem