C ++ GDI + Objects内存泄漏/对象太多?

时间:2015-07-17 08:58:35

标签: c++ memory-leaks gdi+

我一直在制作一个c ++绘图程序,我有一个部分,我在一个函数内使用gdi +绘图,所以我需要在每次调用函数时声明我的图形对象..这显然是错误的,导致某处泄漏所以一些调用它会变慢,然后突然停止一起绘制,如预期的那样。

我试图在每次完成绘图时清除我的对象但它似乎无法解决问题。我想也许PEN对象是问题的一部分,但一些见解会非常有帮助 我的代码:

void function()
{
    DWORD pdwGduStartup;
    GdiplusStartupInput GdiStartupInp;
    GdiplusStartup(&pdwGduStartup, &GdiStartupInp, NULL);
    Pen pnPen_Blue(Gdiplus::Color(255, 0, 0, 255), 2.0F);
    Pen pnPen_Green(Gdiplus::Color(255, 255, 0, 255), 2.0F);


    LPCSTR LGameWindow = "MyWindow";
    HWND hGameWindow = FindWindow(NULL, LGameWindow);
    Graphics graphics(GetDC(hGameWindow));
for (int n=10; n>0; n--)
    graphics.DrawLine(&pnPen_Green,0, 0, 0, n);
    GdiplusShutdown(pdwGduStartup);
    graphics.Flush();
}

非常感谢!

编辑:添加版本DC没有做任何事情!

DWORD pdwGduStartup;
GdiplusStartupInput GdiStartupInp;
GdiplusStartup(&pdwGduStartup, &GdiStartupInp, NULL);
Pen pnPen_Blue(Gdiplus::Color(255, 0, 0, 255), 2.0F);
Pen pnPen_Green(Gdiplus::Color(255, 255, 0, 255), 2.0F);


LPCSTR LGameWindow = "MyWindow";
HWND hGameWindow = FindWindow(NULL, LGameWindow);
HDC GDC = GetDC(hGameWindow);
Graphics graphics(GDC);
ReleaseDC(hGameWindow, GDC);
GdiplusShutdown(pdwGduStartup);
graphics.Flush();

我的GDI对象仍然上升到10,000!

4 个答案:

答案 0 :(得分:2)

必须在删除所有GDI +对象后调用GdiplusShutdown。在你的代码中,当对象超出范围时,在GdiplusShutdown之后调用Pen和Graphics析构函数。

答案 1 :(得分:0)

我想问题出在GetDC。您应该致电ReleaseDC或使用WTL智能指针。

我记得很容易用任务管理器调试的东西。它显示了HANDLE计数以及进程的GDI对象计数,因此您可以看到哪些行生成新对象。

答案 2 :(得分:0)

我没有逻辑地编码我的GDI +。在逻辑中首先你需要创建图形对象,然后才循环绘制它。其他任何事情都是错误的,代码不会解决它!

答案 3 :(得分:0)

尝试这样的事情,使用完成后可以轻松删除的指针。

DWORD pdwGduStartup;
GdiplusStartupInput GdiStartupInp;
GdiplusStartup(&pdwGduStartup, &GdiStartupInp, NULL);
Pen pnPen_Blue* = new Pen(Gdiplus::Color(255, 0, 0, 255), 2.0F);
Pen pnPen_Green* = new Pen(Gdiplus::Color(255, 255, 0, 255), 2.0F);

LPCSTR LGameWindow = "MyWindow";
HWND hGameWindow = FindWindow(NULL, LGameWindow);
HDC GDC = GetDC(hGameWindow);
Graphics* g = new Graphics(GDC);

// Do stuff here

ReleaseDC(hGameWindow, GDC);
delete pnPen_Blue;
delete pnPen_Green;
g->Flush();
delete g;
delete GDC; // not sure
GdiplusShutdown(pdwGduStartup);