GDI-Objekte werden nicht freigegeben



  • Folgender Code:

    CBitmap	MyCBitmap;
    CBitmap TempBmp;
    CBrush	Brush, *pBrushOld;
    
    // LoadImgFromFile benützt intern GDI+ um ein png-File von der
    // Platte zu lesen. 
    // Mittels Gdiplus::Bitmap::GetHBITMAP hol ich ein HBITMAP
    TempBmp.Attach((HBITMAP)il.LoadImgFromFile(AfxGetInstanceHandle(), csPath, iltBitmap, true));
    // Wird das gesuchte Bild auf der Platte nicht gefunden
    // wird ein Default aus der Resourcen geladen
    if((HBITMAP)TempBmp == NULL)
    	MyCBitmap.LoadBitmap(IDB_PUTZ);
    
    // Brush erzeugen, 
    if((HBITMAP)TempBmp != NULL)
    	Brush.CreatePatternBrush(&TempBmp);
    else
    	Brush.CreatePatternBrush(&MyCBitmap);
    
    pDC->SetBrushOrg((int)dX, rect.top);
    pBrushOld = pDC->SelectObject(&Brush);
    pDC->Rectangle((int)dX, rect.top, (int)(dX + dDicke + 1), rect.bottom);
    
    pDC->SelectObject(pBrushOld);
    // Macht ein DeleteObject auf das HBITMAP von GetHBITMAP (GDI+)
    il.Clear();
    Brush.Detach();
    Brush.DeleteObject();
    MyCBitmap.DeleteObject();
    TempBmp.DeleteObject();
    

    Dieser Ausschnitt wird sehr oft hintereinander aufgerufen.
    Nach jedem Durchlauf hab ich 3 GDI-Objekte mehr offen, als zu Beginn, obwohl ich meiner Meinung nach alles schließe/freigebe. Dies führt nach einer gewissen Zeit zu Problemen, da bei ~10000 GDI-Objekten Schluss ist.

    Sieht hier jemand, was ich vergessen habe oder falsch mache?

    Danke.


  • Mod

    Du hast ein Brush.Detach gemacht und kein DeleteObject!

    Vergiss die Aufrufe von DeleteObject doch einfach, dass macht der Destruktor!



  • Danke, es waren aber eigentlich zwei Probleme.
    Das mit dem Detach() und im darunterliegenden Code beim Laden des PNG. Jetzt passt es aber.

    Danke für die Hilfe.


Log in to reply