【发布时间】:2015-10-06 22:43:39
【问题描述】:
我一直在制作一个 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 个!
【问题讨论】:
-
我可能弄错了,但我认为 Pen 类析构函数应该删除它使用的任何内部 GDI 对象。
-
@jensa,但我怎么能摧毁它呢? en.cppreference.com/w/cpp/language/destructor
-
您永远不会显式调用对象析构函数,当对象超出范围时,该语言会为您执行此操作。在这种特殊情况下,当函数结束时。
-
调用 ReleaseDC 并不意味着你正在清理 GDI 对象。
-
那我该怎么做呢?
标签: c++ memory-leaks gdi+