我有函数,它会创建Gdiplus::Bitmap
。
Bitmap *LoadBitmapT(const unsigned char* fileBuffer, size_t length) {
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, length);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, fileBuffer, length);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
Gdiplus::Bitmap *bitmap = Gdiplus::Bitmap::FromStream(pstm, FALSE);
GlobalUnlock(m_hMem);
pstm->Release();
return bitmap;
}
如您所见,由于GlobalAlloc()
而出现内存泄漏。
当我尝试使用GlobalFree(m_hmem)
时,它解决了我的问题并且内存泄漏消失了。但我正在使用此代码在另一个函数中绘制获得的位图:
Graphics graphics(hdc);
graphics.DrawImage(bitmap, ....);
当我不使用GlobalFree()
时,绘制的图像是正确的。但是当我使用提到的功能时,我失去了正确的图像,就像蓝屏一样。
我尝试保存m_hMem
的指针并在绘制位图后调用GlobalFree()
。所以,这没关系。但我需要在获得的位图上使用旋转,所以当我调用bitMap->RotateFlip(RotateNoneFlipX);
时,内存泄漏再次出现。在位图中手动更改某些像素颜色会产生相同的行为。
那么,我该如何为此图像释放内存并正确绘制此图像。我需要它,因为我定期绘制大量图像,所以这会分配大量内存然后我的程序崩溃。
修改
我试过这段代码:
Bitmap *LoadBitmapT(const unsigned char* fileBuffer, size_t length) {
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, length);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, fileBuffer, length);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
Gdiplus::Bitmap *bitmap = Gdiplus::Bitmap::FromStream(pstm, FALSE);
GlobalUnlock(m_hMem);
pstm->Release();
GlobalFree(m_hMem);
return NULL;
}
在此之后我正在寻找任务经理,而不是我看到记忆力不会增加。
当我在bitmap->RotateFlip(RotateNoneFlipX);
之后给Gdiplus::Bitmap *bitmap = Gdiplus::Bitmap::FromStream(pstm, FALSE);
并且代码相同但只添加了这一行时,内存正在增加。
答案 0 :(得分:2)
我找到了答案。
此代码释放所有正确的内容。
HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, length);
BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
memcpy(pmem, fileBuffer, length);
IStream* pstm;
CreateStreamOnHGlobal(m_hMem, FALSE, &pstm);
Gdiplus::Bitmap *bitmap = Gdiplus::Bitmap::FromStream(pstm, FALSE);
pstm->Release();
GlobalUnlock(m_hMem);
bitmap->RotateFlip(RotateNoneFlipX);
delete bitmap;
GlobalFree(m_hMem);
需要按正确顺序拨打电话。首先删除位图,然后删除GlobalFree