Leaksearch
-
Hallo hallo,
wenn ich mit der Maus an meinem Fenster herumziehe, steigt der Speicherverbrauch immer weiter an - Leak.
Jetzt bin ich auf der Suche.
Ganz einfache Frage:
void WriteFontText(HDC hDC,int x,int y,std::string Text,const char* Font,int FontHeight,int FontWidth) { HFONT hFont = CreateFont(FontHeight,FontWidth,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,Font); SelectObject(hDC,hFont); TextOut(hDC,x,y,Text.c_str(),Text.length()); SelectObject(hDC,hFont); DeleteObject(hFont); }^- Da ein Leak drin?

Danke schonmal,
Gruß Max
-
Natürlich:
Jedesmal, wenn du ein SelectObject nutzest, gibt die Funktion dir ein Objekt zurück. Das musst du nachher wieder reinbringen:HFONT oldFont; oldFont = SelectObject(hDC, hFont); // das alte Objekt speichern // .. anweisungen .. // SelectObject(hDC, oldFont); // und wieder reinbringen (hier würde hFont zurückgegeben, das brauchst du natürlich nicht zu speichern, gibts ja schon in hFont DeleteObject(hFont); // nur hFont, oldFont NICHT deleten!
-
Ohauaha, dann hab ich wesentlich mehr als nur ein Leak hehe ...
Also allgemein würde das bedeuten, durch ein HGDIOBJ SelectObject(HDC hdc,HGDIOBJ h) wird das im DC bestehende GDIOBJ mit h ausgetauscht und daher tauscht man wieder zurück?
Was wäre dann, wenn ich auch oldFont mit DeleteObject() rausschmeiße und dann TextOut() anwende?
Wird wohl nichts geschrieben, oder?
Danke, für die Erleuchtung!
Gruß, Max
-
Genau kann ich dir nicht sagen, was passiert.
Faustregel: Jedes SelectObject gibt ein HGDIOBJ zurück, was nachher wieder rein muss. Solange du dich da dran hältst, sollte es von der Seite keinerlei Probleme geben.
-
Okidoky,
dh. berichtigt sieht die Funktion so aus:
void WriteFontText(HDC hDC,int x,int y,std::string Text,const char* Font,int FontHeight,int FontWidth) { HFONT hFontNew,hFontOld; hFontNew = CreateFont(FontHeight,FontWidth,0,0,FW_NORMAL,0,0,0,ANSI_CHARSET, OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_ROMAN,Font); hFontOld = (HFONT)SelectObject(hDC,hFontNew); TextOut(hDC,x,y,Text.c_str(),Text.length()); SelectObject(hDC,hFontOld); DeleteObject(hFontNew); }Richtig?
Gruß, Max
-
Führ sie doch einfach 1000 mal aus, und guck nach ob der Speicher wächst
-
Ok ok, ich hab nun alle Leaks raus.
Ich hab auch Bitmaps gebitbltet ohne den CompatibleDC mit DeleteDC wieder freizugeben

Jaja^^
Vielen vielen Dank mad_martin!

lg Max