【发布时间】: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