【问题标题】:MFC HBITMAP memory leak does not go awayMFC HBITMAP 内存泄漏不会消失
【发布时间】:2013-09-27 10:22:58
【问题描述】:

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

【问题讨论】:

  • 您如何检查出正是导致内存问题的代码?
  • 任务管理器不是内存分析器,它完全无法完成这项工作。但是,它可以更好地处理您实际担心的泄漏。查看 + 选择列并勾选 GDI 对象。
  • @varnie 每当更改组合框的选定索引时,都会调用此函数。所以我所做的是在组合框条目中反复上下滚动,每次选择一个不同的条目,同时监控任务管理器的内存使用情况。我注意到内存向上飙升(并留在那里)与我在组合框中滚动/选择不同索引之间存在直接关系。还有一点我要指出的是,我把上面的函数完全注释掉了,重复上面的过程,发现当时内存并没有一直增加。 ://
  • @HansPassant 我确实在我的任务管理器中启用了 GDI 对象列,我记得看到它在 107-110 左右保持稳定,尽管内存使用量不断增加?我在想我没有删除所有对象或没有正确/在正确的时间删除它们?
  • 正如我所说,强烈表明您实际上没有泄漏。只需编写测试代码,围绕该代码循环并执行一百万次。使用预期的行为,您会看到内存使用率上下波动,但永远不会失控来轰炸代码。

标签: c++ memory mfc memory-leaks hbitmap


【解决方案1】:

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 消息返回的位图相同。客户端负责删除发送到静态控件的任何位图。

【讨论】:

  • 我认为你是对的,这就是为什么我在上面的函数中添加了 DeleteObject() 调用,但没有成功。然而,我的问题是......我如何编写代码来阻止这种泄漏并阻止我的内存不断增加?
  • 使用您的代码我无法创建任何 GDI 泄漏。代码仍然是错误的,因为你删除了一个仍在使用的对象。
猜你喜欢
  • 2011-12-18
  • 2011-12-14
  • 2019-06-03
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 2010-10-30
  • 1970-01-01
相关资源
最近更新 更多