GDI MemLeak???



  • Hallo!

    Siehe folgenden Code:

    // der möglicherweise fehlerhafte Code
    CDC tmpDC; 
    tmpDC.CreateCompatibleDC(adc);
    tmpDC.SelectObject(tmp_cBmp); // Original-Objekt wird nicht gespeichert!
    // ... diverse Operationen auf tmpDC
    DeleteDC(tmpDC);
    

    Zum Problem: Ich bin mir nicht sicher, ob hier ein Memory Leak entsteht oder nicht.
    Einerseits wird ja immer gesagt, man muss bei SelectObject das Original Objekt speichern und vorm Löschen vom DC wieder hineinselektieren.
    Andererseits hab ich mir einerseits mit dem Tast Manager, andererseits mit einer kleinen Logfunktion die Anzahl an GDI Objekten des aktuellen Prozesses angeschaut.

    // Ausschnitt aus der Log Funktion
    unsigned long gdiCtr = GetGuiResources(GetCurrentProcess(),GR_GDIOBJECTS);
    FILE* f=fopen("gdi_ctr.txt","a+");
    fprintf(f,"\n%d",(int)gdiCtr);
    fclose(f);
    

    Und dort ist die Anzahl der GDI Objekte konstant.
    Wie passt das mit der Aussage zusammen, dass man Memory Leaks bekommt, wenn man die Original Objekte nicht wieder reinselektiert?

    Warum das ganze? Die Funktion CreateCompatibleDC liefert ab einem bestimmten Punkt einen Null-Handle, kann also keinen DC mehr erzeugen. Ich hab irgendwie die Vermutung, dass irgendwo im Programm (evtl. die oben genannte Stelle) GDI Objekte nicht mehr freigegeben werden.





  • Schau dir genauer diese API Funktionen an: SaveDC, RestoreDC, DeleteObject und SelectObject.
    Bei SelectObject hast zu wenig Argumente:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd162957(v=vs.85).aspx


Log in to reply