Mein Programm wird immer größer(RAM-Nutzung)



  • 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* _openTab s ( _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


Anmelden zum Antworten