CPen und CBrush wird nicht freigegeben?



  • Hallo,

    nachdem ich in einem anderen Thread (danke, Polofreak) das Tool MemProof entdeckt habe, wollte ich dieses benutzen, um einem von mir seit langem eingebautem Fehler auf den Grund zu gehen:
    Ein Programm stürzte nach einer bestimmten Anzahl von Mausklicks, während derer immer etwas gezeichnet wird, ab.
    Fehlermeldung dabei: Iregndwelche Ressourcen reichen nicht aus...

    Jetzt habe ich festgestellt, dass in folgendem Code:

    // Zeichenelemente vorbereiten
    	CPen* pOldPen = NULL;
    	CPen Stift(PS_SOLID,2,RGB(0,0,0));
    	pOldPen = pDC->SelectObject(&Stift);
    
    	CBrush* pOldBrush = NULL;
    	CBrush FuellPinselWeiss(RGB(255,255,255));
    	pOldBrush = pDC->SelectObject(&FuellPinselWeiss);
    
    ... (hier wird etwas gezeichnet)...
    
    	if(pOldPen != NULL)
    		pDC->SelectObject(pOldPen);
    	if(pOldBrush != NULL)
    		pDC->SelectObject(pOldBrush);
    
    	Stift.Detach();
    	FuellPinselWeiss.Detach();
    	Stift.DeleteObject();
    	FuellPinselWeiss.DeleteObject();
    

    Der CPen und der CBrush nicht freigeben werden.
    Warum nicht? Ich rufe doch, ordentlich wie ich bin, .DeleteObject() auf.
    Trotzdem zeigt mir MemProof an, dass die Anzahl der CPen und CBrush mit jedem Mausklick zunimmt.
    Kommentiere ich den obigen Codeteil aus, wird die Anzahl nicht erhöht.
    Was habe ich hier übersehen?



  • Kommentier mal die Detach aus. Ich glaube die koppeln die Objekte vom Zeiger ab oder so.



  • Genau, das wars...

    Danke schön.
    Wofür brauche ich dann aber das Detach()? Ich habe es bei irgendeiner Ausprobierererei mal reingemacht. Soweit ich mich erinnern kann, habe ich irgendwo gelesen, dass das notwendig sei. Aber für was wohl?



  • Frag lieber nochmal nen Experten, aber IMHO ist das dafür da, wenn man ein Objekt über den normalen Lebenszyklus hinaus haben muss.

    Die MSDN hat es leider auch nicht so toll erklärt. 😞



  • Das Detach setzt einfach das Handle (HPEN, HBRUSH) das mit dem Objekt assoziiert ist auf NULL. Und dann kann der DeleteObject aufruft ja nicht mehr funktionieren, da ja kein Handle darauf mehr verfügbar ist.



  • Na ja,
    das klingt jetzt irgendwie so, als könnte ich diese Funktion in Zukunft einfach ignorieren. So wichtig scheint sie ja nicht zu sein...



  • Wichtig ist sie schon. Nur in diesem Zusammenhang einfach falsch. 😉


Anmelden zum Antworten