всякий раз, когда я выполняю приведенный ниже код, моя память в диспетчере задач для приложения непрерывно увеличивается. Здесь я нашел похожие вопросы о stackoverflow, и я сделал несколько вызовов DeleteObject, как они заявили, но это все равно не решило все увеличивающееся количество памяти при выполнении этого кода.
Как это можно решить? Что я делаю неправильно?
SetControlPicture(const UINT ID_PICTURE_CONTROL)
{
CImage image;
CBitmap bitmap;
HRESULT hresult;
CStatic* pItem = (CStatic*)GetDlgItem(ID_PICTURE_CONTROL);
hresult = image.Load(_T("./Data/Images/RED_ON.png"));
if(hresult != E_FAIL)
{
HBITMAP hBitMap = image.Detach();
bitmap.Attach(hBitMap);
HBITMAP hBitMapPrev = pItem->SetBitmap(bitmap);
if (hBitMapPrev)
{
DeleteObject(hBitMapPrev); // *** do not forget to delete the previously associated bitmap
}
DeleteObject(hBitMap);
}
}
AFAIK Согласно документации это должно течь. Так как общий контроль вер. 6.0 вы обязаны удалить растровое изображение. Недостаточно удалить возвращенное растровое изображение.
http://msdn.microsoft.com/en-us/library/windows/desktop/bb760782(v=vs.85).aspx
В версии 6 элементов управления Microsoft Win32 растровое изображение, передаваемое статическому элементу управления с помощью сообщения STM_SETIMAGE, представляло собой то же растровое изображение, возвращаемое последующим сообщением STM_SETIMAGE. Клиент несет ответственность за удаление любого растрового изображения, отправленного статическому элементу управления.
Других решений пока нет …