额.. 又漏了…
这次是GDI+ 的调用引起的, 看代码吧:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
int main() { Gdiplus::GdiplusStartupInput input; Gdiplus::GdiplusStartupOutput output; ULONG ulToken = 0; Gdiplus::GdiplusStartup(&ulToken, &input, &output); HWND hwndDesktop = ::GetDesktopWindow(); HDC hdcDesktop = ::GetDC(hwndDesktop); HDC hdcMem = ::CreateCompatibleDC(hdcDesktop); for (int i = 0; i < 300; i++) { HBITMAP hbmpMem = ::CreateCompatibleBitmap(hdcMem, 1024, 768); HBITMAP hbmpOldMem = (HBITMAP)::SelectObject(hdcMem, hbmpMem); Gdiplus::Bitmap *bmpImage = new Gdiplus::Bitmap(L"C:\AmaneMisa1.jpg"); //{ Gdiplus::Graphics g(hdcMem); g.DrawImage(bmpImage, 0, 0, 1024, 768); //} delete bmpImage; ::SelectObject(hdcMem, hbmpOldMem); ::DeleteObject(hbmpMem); } ::DeleteDC(hdcMem); ::ReleaseDC(hwndDesktop, hdcDesktop); Gdiplus::GdiplusShutdown(ulToken); ::MessageBox(NULL, L"aa!", L"a", MB_OK); return 0; } |
主要问题在于Graphics 那个对象. 实际上当前代码的SelectObject() 调用是错误的, 结果就是HBITMAP 对象又泄漏了. 解决的办法就是Graphics 对象用完了就删掉, 就不会锁住里面的HBITMAP 对象了. 方法有2 种: 1) 加一个作用域, 就是把上面的注释去掉. 2) new 一个Graphics 对象, 用完了直接delete 掉.
发现GDI+ 虽然封装了一些比较好用的函数, 但是很容易出错, 而且performance 也不太好. 以后还是少用为妙.