请问这段代码有问题吗。。为嘛内存泄露啊

qwqwqw408 2012-03-28 10:50:55

HDC g_screenDC = GetDC(NULL);
BOOL CGDITestDlg::OnInitDialog()
{
CDialog::OnInitDialog();

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标

SetTimer(1000,100,0);
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CGDITestDlg::OnPaint()
{
PAINTSTRUCT paintStruct;
::BeginPaint(this->m_hWnd,&paintStruct);
::EndPaint(this->m_hWnd,&paintStruct);

// 创建或者销毁对话框
if(g_dlg)
{
g_dlg->DestroyWindow();
delete g_dlg;
g_dlg = NULL;
}else
{
g_dlg = new CTestDialog1();
g_dlg->Create(IDD_DIALOG1, NULL);
g_dlg->ShowWindow(SW_SHOW);
}
// 内存信息
WCHAR buf[MAX_PATH] = {0};
MEMORYSTATUS mem_stat;
memset(&mem_stat,0,sizeof(MEMORYSTATUS));
mem_stat.dwLength = sizeof(MEMORYSTATUS);
GlobalMemoryStatus(&mem_stat);
_snwprintf(buf,MAX_PATH,L"%d %d",mem_stat.dwTotalPhys/1024, mem_stat.dwAvailPhys/1024);

HDC memDC = CreateCompatibleDC(g_screenDC);
HBITMAP hBitmap = CreateCompatibleBitmap( memDC, 800 , 600 );
HGDIOBJ hObj = SelectObject( memDC , hBitmap );
SetBkColor(memDC,RGB(0,0,0));
SetTextColor(memDC,RGB(255,255,255));
RECT rect = {0,0,800,600};

DrawText(memDC,buf,-1, &rect, DT_VCENTER|DT_CENTER);
// 将临时DC绘制到屏幕
BitBlt( g_screenDC, 0 , 0 ,800,600 ,memDC,0,0,SRCCOPY);
// 销毁
if(memDC && hObj)
{
::SelectObject(memDC,hObj);
}
if(memDC)
{
::DeleteDC(memDC);
}
if(hBitmap)
{
::DeleteObject(hBitmap);
}

}
CDialog* g_dlg = NULL;
void CGDITestDlg::OnTimer(UINT_PTR nIDEvent)
{
CDialog::OnTimer(nIDEvent);
// 刷新界面
SendMessage(WM_PAINT,0,0);
}

CTestDialog1 是一个很普通的对话框,用向导添加的,就2个button
这段代码,内存不会断减少,但不是每次调用都减少,而是某个速度,比如几十秒减少4或者8K。。
...全文
109 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qwqwqw408 2012-03-29
  • 打赏
  • 举报
回复
而且我加了释放DC和释放bitmap的返回值判断,都是成功的。。
qwqwqw408 2012-03-29
  • 打赏
  • 举报
回复
貌似只要不重新创建对话框就没事,刷新的再快都不会泄露。就算有动态内存分配,用new,那就说明不是释放来不及或者内存碎片的问题。
91program 2012-03-29
  • 打赏
  • 举报
回复
CE 的内存管理机制是比较差,以前看过一文章,说内存的申请与释放最好是采用堆栈的顺序:即最先申请的最后释放。否则,会产生内存碎片。当内存够用时,CE 是没有处理这种情况的。
全局变量,也是必须释放的,特别是 DC 这种内核对象。程序退出后,申请的内核对象是不会自动被释放的。

LZ,将代码修改一下再试试吧。
if(memDC && hObj)
{
::SelectObject(memDC,hObj);
}
if(hBitmap)
{
::DeleteObject(hBitmap);
}
if(memDC)
{
::DeleteDC(memDC);
}
91program 2012-03-29
  • 打赏
  • 举报
回复
LZ 有没有试过长时间运行,会不会将内存耗尽?
qwqwqw408 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
CE 的内存管理机制是比较差,以前看过一文章,说内存的申请与释放最好是采用堆栈的顺序:即最先申请的最后释放。否则,会产生内存碎片。当内存够用时,CE 是没有处理这种情况的。
全局变量,也是必须释放的,特别是 DC 这种内核对象。程序退出后,申请的内核对象是不会自动被释放的。

LZ,将代码修改一下再试试吧。
if(memDC && hObj)
{
::SelectObj……
[/Quote]

一般不是把DC先释放吗,因为bitmap句柄可能释放不成功,貌似先删除DC就不会
qwqwqw408 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
LZ 有没有试过长时间运行,会不会将内存耗尽?
[/Quote]

一个小时不到,就少了100多K,照此趋势,是会耗尽的
qwqwqw408 2012-03-29
  • 打赏
  • 举报
回复
发现对话框上没有控件的时候,内存比以前减少的慢,但是还是会减少。哎,到底是嘛问题啊
yhp1888 2012-03-29
  • 打赏
  • 举报
回复
windows ce的内存管理机制和普通windows不同,上面各位说到的都是内存碎片的现象。

原因是windows ce针对的设备都是小内存的。

它的表象是,不要频繁地开、放内存,否则wince来不及释放。

最佳解决办法是,使用全局变量,使程序一启动就开好了内存,当然占用内存太的程序需要使用其它技巧。
qwqwqw408 2012-03-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
DC是不是需要Release啊
[/Quote]

那个是全局变量,只Get了一次而已
西山小月 2012-03-28
  • 打赏
  • 举报
回复
DC是不是需要Release啊
qwqwqw408 2012-03-28
  • 打赏
  • 举报
回复
下面是10几分钟时间内,物理内存剩余量的变化
23308
23304
23296
23292
23288
23276
23272
23252
23248
23236
23232
23216
23212
23200

19,504

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧