Archief - [PROG]C++ memory leak -_-

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Holy Paladin

Legacy Member
owke, als iemand goesting heeft om een memory leak te zoeken..
ik heb dus code geschreven/aangepast voor bitmaps te roteren, dat is gelukt maar ik begrijp maar de helft van wat ik geschreven heb. toch denk ik dat alle handles gedelete heb, maar ik ben uiteraard verkeerd want er is een leak!

er zijn in totaal 5 handles, 4 worden gedelete. hOldBmp wordt niet gedelete, omdat dat in het origineel ook niet was, en als ik ze delete is de leak niet weg

Code:
HDC hdcBuffer = CreateCompatibleDC(hDC);
HBITMAP hbmpBuffer = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
HBITMAP hOldBmp = (HBITMAP) SelectObject(hdcBuffer, bitmap->GetHandle());
HDC hdcNew = CreateCompatibleDC(hdcBuffer);
SelectObject(hdcNew, hbmpBuffer); // put the bitmap in hdcNew

BitBlt(hdcNew, 0, 0, rect.right, rect.bottom, hdcBuffer, 0, 0, SRCCOPY);

RotateMemoryDC(hbmpBuffer, hdcBuffer, rect.right, rect.bottom, iRotation, hdcNew, newright, newbottom);
----------------------------------
	in deze functie RotateMemoryDC nog wat handlestuff:

	hdcNew = CreateCompatibleDC(hdcBuffer);
	HBITMAP hbmpNew = CreateCompatibleBitmap(hdcBuffer, newright, newbottom);
	SelectObject(hdcNew, hbmpNew);


	DeleteObject(hbmpNew);
-----------------------------------

TransparentBlt(hDC, X, Y, W, H, hdcNew, 0, 0, newright, newbottom, RGB(255,0,255));
		
DeleteDC(hdcBuffer);
SelectObject(hdcNew, hOldBmp);
DeleteObject(hbmpBuffer);
DeleteDC(hdcNew);
(ik heb de meeste niet relevante code ervantussen gesmeten, for your viewing pleasure)

Deguchi

Legacy Member
Kan het zijn dat het fout loopt met de geforceerde conversie van de SelectObject() naar een HBITMAP?

En wat doet deze regel? SelectObject(hdcNew, hOldBmp);

Holy Paladin

Legacy Member
ik denk niet dat die cast een probleem is, aangezien het in de originele code ook gebeurt zonder problemen.

en wat dat 2de lijntje doet weet ik ook niet precies (of waarom het nodig is) maar dat stond ook weer in de originele code :p (wel met een andere hdc)

killgore

Legacy Member
hdcNew = CreateCompatibleDC(hdcBuffer);

Gebruik je 2x, 1x in main functie, 1x in die rotate.

Als je in rotate een referentie meegeeft moet je eerst die vorige initialisatie vrijgeven. Als je een pass-by-value doet moet je deze binnen de functie nog vrijgeven.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan