none
windows字体资源无法释放问题,高手请进! RRS feed

  • 问题

  • 因为需要字体的放缩,在用CreateFontIndrect生成不同大小的字体,显示完成后, 执行DeleteObject删除字体,
    但内存占用会随着生成不同大小字体的增多,而增加,一直不能降下来,大家是否也遇见过此类问题,望大家能帮忙解决!
    代码如下:

    HFONT CreateFont(HDC hdc, int fontsize)
    {
     HFONT hFont;
     LOGFONT logFont;
     memset(&logFont,0,sizeof(logFont));
     logFont.lfHeight = fontsize;
     logFont.lfQuality = DEFAULT_QUALITY;
     logFont.lfCharSet = GB2312_CHARSET;
     logFont.lfWeight = FW_NORMAL;
     _tcscpy_s(logFont.lfFaceName, LF_FACESIZE, _T("宋体"));
     hFont = ::CreateFontIndirect(&logFont);
     _ASSERT(hFont != NULL);
     return hFont;
    }

    void CzzzzDlg::OnBnClickedButton1()
    {
     HDC hdc = ::GetDC(this->m_hWnd);
     int fontsize = 5;
     for (int i = 0; i < 10000; ++i)
     {
      fontsize += 1;
      HFONT hFont =  CreateFont(hdc, fontsize);
      HFONT hOldFont = (HFONT)::SelectObject(hdc, hFont);
      ::TextOut(hdc,0, 0,  _T("中国!"), 3);
      ::SelectObject(hdc, hOldFont);
      ::DeleteObject(hFont);
     }
     ::ReleaseDC(this->m_hWnd, hdc);
    }

    执行完上述代码后,内存占用达到 2G多。一直将不下来,如果循环次数增加,内存占用会线性增加

    2009年4月2日 7:38

答案

  • 经过测试,在XP下只要应用Unicode字符集,则会出现泄漏。中文,日语,韩语都有这个问题。DrawText也是一样,怀疑是GDI内部实现的问题。
    2009年4月8日 5:35
    版主
  • 我觉得也是GDI内部实现的问题,刚我把GB2312_CHARSET 改为 OEM_CHARSET,则不存在泄漏,不过设置的字体就不起作用了,无法显示 “隶书”等字体了。
    2009年4月8日 5:59
  • 就是GDI内部实现问题。用OEM_CHARSET则无法正确映射中文字符集,应该是映射过程出现泄漏。
    2009年4月9日 4:57
    版主

全部回复

  • 不要分成两个函数,将两个函数合在一起试试
    欢迎光临我的个人网站:http://www.joyvc.cn,本网站提供[IM即时通信|棋牌游戏|网游开发|UI编程|网络通讯|组件开发|图像多媒体|数据库]方面的VC/C++/C技术文章、源代码和教程资料
    2009年4月2日 8:18
    版主
  •   ::DeleteObject(::SelectObject(hdc, hOldFont));吗,试过了,不行!
    2009年4月2日 12:13
  • 在我的计算机(Vista)上经过测试,没有发现问题,内存只增长了5M.
    你看看是不是其他的地方的问题


    Hello world
    2009年4月3日 12:59
    版主
  • 对于CFont等常用GDI资源,可以使用享元模式,不需要创建大量资源。

    2009年4月7日 1:25
    版主
  • 因为使用了多种字体,又由于需要放缩,故会产生这样的问题,减少字体的生成当然可以解决这个问题,但总要知道产生此问题的根源!

    2009年4月7日 2:15
  • 这个是由于::TextOut在处理Unicode字符集产生的错误。你可能用的是ANSI。中国!的后半部分产生了泄漏。使用_UNICODE即可解决。
    2009年4月7日 3:31
    版主
  • 楼上说的很有道理,我用UNICODE了,问题还是存在,如果我把 "中国!",改为“abc”就不存在问题了!不过问题还是没有解决!
    2009年4月8日 5:28
  • 经过测试,在XP下只要应用Unicode字符集,则会出现泄漏。中文,日语,韩语都有这个问题。DrawText也是一样,怀疑是GDI内部实现的问题。
    2009年4月8日 5:35
    版主
  • 我觉得也是GDI内部实现的问题,刚我把GB2312_CHARSET 改为 OEM_CHARSET,则不存在泄漏,不过设置的字体就不起作用了,无法显示 “隶书”等字体了。
    2009年4月8日 5:59
  • 直接设成0(ANSI_CHARSET),看看行不行


    Hello world
    2009年4月8日 14:51
    版主
  • 就是GDI内部实现问题。用OEM_CHARSET则无法正确映射中文字符集,应该是映射过程出现泄漏。
    2009年4月9日 4:57
    版主