c ++从内存加载位图 - 内存泄漏

时间:2015-10-05 16:00:45

标签: c++ memory-leaks bitmap gdi+

我有函数,它会创建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);并且代码相同但只添加了这一行时,内存正在增加。

1 个答案:

答案 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