mfc 定时多线程运行一段时间后 内存满了

mfc 定时多线程运行一段时间后 内存满了,是哪里出现问题了?怎么弄

img

img

SYSTEMTIME st;GetLocalTime(&st);
DWORD CurrentTime,jisuanTime = 0, huanhang = 0, huanhangjisu = 0, val = 0;
DWORD hang[100], hangshu = 0;
CString l_str1, l_str3, code, longcode;
CurrentTime = st.wHour * 60 * 60 + st.wMinute * 60 + st.wSecond;
int l_int = (int )Context;
HWND l_hwnd;RECT rctA; HDC g_memDc; HDC disDc;
l_hwnd = All_hwnd[l_int];
shibieCode shibie;
SaveSymGuocheng savesymguocheng;
savesymguocheng.线程 = l_int;
::GetWindowRect(l_hwnd, &rctA);
int src_x = rctA.right - rctA.left;
int src_y = rctA.bottom - rctA.top + 2;
disDc = ::GetWindowDC(l_hwnd);
g_memDc = CreateCompatibleDC(disDc);
HBITMAP hbitMap = CreateCompatibleBitmap(disDc, src_x, src_y);
SelectObject(g_memDc, hbitMap);
BitBlt(g_memDc, 0, 0, src_x, src_y, disDc, 0, 0, SRCCOPY);
BITMAP bmpInfo;
LPBYTE lpOrigiPixel = NULL;
DWORD dwOigiPixelLen = 0;
memset(&bmpInfo, 0, sizeof(BITMAP));
GetObjectA(hbitMap, sizeof(BITMAP), &bmpInfo);
dwOigiPixelLen = bmpInfo.bmWidth
bmpInfo.bmHeight * 4;
DWORD dwPixels = bmpInfo.bmWidth
bmpInfo.bmHeight;
lpOrigiPixel = new BYTE[dwOigiPixelLen];
GetBitmapBits(hbitMap, dwOigiPixelLen, lpOrigiPixel);
DWORD l_kaishihang = 0;
ReleaseDC(l_hwnd, disDc);
ReleaseDC(l_hwnd, g_memDc);
DeleteObject(hbitMap);
delete[]lpOrigiPixel;
Sleep(10);
return;

那肯定是内存泄露了
1 走读代码,检查哪里有未释放的内存
2 不好检查的话,WINDBG DEBUG调试

初看没有内存泄漏之处
一是确定泄漏是这段代码引起的吗?可以把代码块注释掉,看看内存增长情况
二是系统退出时,看看输出日志,是否有memory leak泄漏提示,看看能不能定位泄漏点

selectobject一定要注意函数结束前恢复原有的dc数据

可能是内存泄露了,看下日志信息,或者debug模式下看看,注释掉相关代码测试下

资源申请和释放过于频繁,大量的内存分配可能导致内存无法及时回收,建议将资源初始化好后重复利用。减少重复的申请和释放应该可以解决问题。

你的代码 CreateCompatibleDC 后没有删掉DC
GetWindowDC 对应释放函数是 ReleaseDC
CreateCompatibleDC 对应释放函数是 DeleteDC ,不是ReleaseDC

你用工具检测一下内存泄露 https://docs.microsoft.com/zh-cn/visualstudio/debugger/finding-memory-leaks-using-the-crt-library?view=vs-2022

这是内存泄漏问题,你使用Visual Studio自带的内存调试工具就可以找出哪里有泄漏了。

img


看到这个我猜 应该就是回调方法里有在内存操作图像文件但是使用完之后并没对其进行释放(或者说没释放成功)

安装一个vld内存泄漏工具检测,这工具使用简单。安装完了直接include一个头文件就可以。
debug调试运行程序,然后如果发现程序占用内存不断增加,正常退出程序,在vs输出窗口就能看到哪里内存泄漏。