c++ - Win32 C++ 中的 DrawText 内存使用量增加

标签 c++ winapi visual-c++ memory mfc

我已经使用 MFC 实现了一个简单的游戏。它包含图像和格式化文本。在测试时,我发现在程序正常运行约 7 分钟后,图像消失并且文本格式重置。为了找出问题,我重写了一个非常基本的版本,它只显示格式化文本。但问题仍然存在,我已经谷歌搜索了一天,但问题仍然存在。这是我的 OnPaint 方法

    CPaintDC dc(this);

    CRect clientRect;
    GetClientRect(&clientRect);

    CDC bitmapDC;
    bitmapDC.CreateCompatibleDC(&dc);

    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(&dc, clientRect.Width(), clientRect.Height());
    bitmapDC.SelectObject(&bitmap);

    CBrush backgroundBrush;
    backgroundBrush.CreateSolidBrush(RGB(0xf8, 0xf8, 0xf8));
    bitmapDC.FillRect(&clientRect, &backgroundBrush);

    int SavedDc = bitmapDC.SaveDC();

    long nHeight = -MulDiv(20, GetDeviceCaps(bitmapDC, LOGPIXELSY), 72);
    HFONT myfont = CreateFont(nHeight, 0, 0, 0, FW_ULTRALIGHT, FALSE, FALSE, FALSE, DEFAULT_CHARSET, OUT_OUTLINE_PRECIS,
        CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, VARIABLE_PITCH, TEXT("Arial"));

    bitmapDC.SelectObject(myfont);
    SetBkMode(bitmapDC, TRANSPARENT);

    bitmapDC.DrawText(L"This shouldn't happen", &clientRect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

    dc.BitBlt(0, 0, clientRect.Width(), clientRect.Height(), &bitmapDC, 0, 0, SRCCOPY);

    bitmapDC.RestoreDC(SavedDc);
    backgroundBrush.DeleteObject();
    bitmap.DeleteObject();
    bitmapDC.DeleteDC();

我可以看到 visual studio 中的内存使用量逐渐增加。如果我注释掉 DrawText 部分,它不会再增加。难道我做错了什么?如何防止 DrawText 方法增加内存使用量?我也用图像测试过,这是同样的问题。我应该以某种方式释放或删除 DrawText 吗?任何帮助将不胜感激。

最佳答案

消失的图像和字体是 GDI 资源泄漏的标志,而不是内存。

虽然泄漏内存非常糟糕,但泄漏资源更糟糕,因为它们非常有限。观察游戏任务管理器中的 GDI Objects 列;当计数器达到 10,000 时 - 你就完成了。

仅仅删除持有 GDI 资源的 MFC 对象是不够的,您需要先从 DC 中取消选择它们(当前选择的对象不能被释放)。

关于c++ - Win32 C++ 中的 DrawText 内存使用量增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37136892/

相关文章:

c++ - 关于入门C++教程,有哪些好书?

c++ - 为什么以下代码中 "C"的值会发生变化?

winapi - Windows 文件历史记录 API : Adding Include Rule

c++ - 我今天应该使用 TCHAR 吗?

c# - visual studio express 2012 中的 PowerPacks 命名空间错误

visual-c++ - WS_EX_LAYERED、不可见窗口和全新安装的 Windows

visual-studio-2010 - nmake/VC++ 2010 : Compile without MSVCR100. dll 依赖

c++ - 异常处理的顺序重要吗?

c++ - 如何缩放二进制数组以保持值

visual-c++ - 自定义分配器与 promise 和打包任务