0

每当我执行以下代码时,我在应用程序任务管理器中的内存都会不断增加。我在 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); 
                }
}
4

1 回答 1

0

AFAIK 根据文档,这必须泄漏。自 Common Control 版本以来。6.0 你有责任删除位图。仅删除返回的 Bitmap 是不够的。

http://msdn.microsoft.com/en-us/library/windows/desktop/bb760782(v=vs.85).aspx

在 Microsoft Win32 控件的版本 6 中,使用 STM_SETIMAGE 消息传递给静态控件的位图与后续 STM_SETIMAGE 消息返回的位图相同。客户端负责删除发送到静态控件的任何位图。

于 2013-09-27T15:45:03.880 回答