首页 > 代码库 > 【转载】gdi+ 内存泄漏

【转载】gdi+ 内存泄漏

【转载】http://issf.blog.163.com/blog/static/1941290822009111894413472/

最近用GDI+实现了几个自定义控件,但是发现存在内存泄露问题

BOOL CGdiplusBugDlg::OnEraseBkgnd(CDC* pDC) 
{
Image* pImage = Image::FromFile(L"E:\\bac.bmp");
Graphics g(pDC->m_hDC);

g.DrawImage(pImage,0,0);

return TRUE;
}

 因为没

delete pImage;

g.ReleaseHDC(pDC->m_hDC);

而这两个操作最好加上,否则肯定会泄露!

就造成了大量的内存泄露。也是奇怪了,在那么多的例子里也都没见去delete gdi+的资源。在网上搜了很久也没有搜到这方面内容。

最初的时候就觉得gdi+不用释放内存太奇怪了,但又没看见它在哪里new了。Image::FromFile直接返回一个指针也是特别奇怪..但MSDN里中居然也不说要去delete.

Bitmap 继承 Image, Image继承 GdiplusBase,在GdiplusBase里面发现了一些东西...

class GdiplusBase
{
public:
void (operator delete)(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}
void* (operator new)(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}
void (operator delete[])(void* in_pVoid)
{
DllExports::GdipFree(in_pVoid);
}
void* (operator new[])(size_t in_size)
{
return DllExports::GdipAlloc(in_size);
}
};