C++ 使用GetHBITMAP()和MFC CStatic::SetBitmap()可能存在内存泄漏

C++ 使用GetHBITMAP()和MFC CStatic::SetBitmap()可能存在内存泄漏,c++,mfc,gdi+,C++,Mfc,Gdi+,我每100毫秒调用一次下面的函数。它的目标是从renderBuffer中获取图像,调整其大小,并使用SetBitmap()将其显示在对话框的CStatic控件中。 问题是,当这个函数被执行时,我每秒都会观察到一个相当大的内存使用峰值。它在CStatis控件中显示调整大小的图像时没有问题,但我在task manager中看到,每秒钟进程都会分配额外的4 MB内存,并且直到进程耗尽内存时才会停止 这是代码,如果你有什么问题,请告诉我 void CAppDlg::UpdatePreview( cons

我每100毫秒调用一次下面的函数。它的目标是从renderBuffer中获取图像,调整其大小,并使用SetBitmap()将其显示在对话框的CStatic控件中。 问题是,当这个函数被执行时,我每秒都会观察到一个相当大的内存使用峰值。它在CStatis控件中显示调整大小的图像时没有问题,但我在task manager中看到,每秒钟进程都会分配额外的4 MB内存,并且直到进程耗尽内存时才会停止

这是代码,如果你有什么问题,请告诉我

void CAppDlg::UpdatePreview( const RenderBuffer* renderBuffer )
{
HBITMAP hbmReturn = NULL; 
Gdiplus::Bitmap  *bmPhoto  = NULL;
Gdiplus::Bitmap bmPhoto( THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT );
CBitmap Bmp1;

Gdiplus::Bitmap image( 780, 780, 4*780, PixelFormat32bppARGB, renderBuffer->buffer );

int sourceWidth  = image.GetWidth();
int sourceHeight = image.GetHeight();

int destX = 0,
    destY = 0; 

float nPercent  = 0;
float nPercentW = ((float)THUMBNAIL_WIDTH/(float)sourceWidth);;
float nPercentH = ((float)THUMBNAIL_HEIGHT/(float)sourceHeight);

if(nPercentH < nPercentW)
{
    nPercent = nPercentH;
    destX    = (int)((THUMBNAIL_WIDTH - (sourceWidth * nPercent))/2);
}
else
{
    nPercent = nPercentW;
    destY    = (int)((THUMBNAIL_HEIGHT - (sourceHeight * nPercent))/2);
}

int destWidth  = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);

bmPhoto.SetResolution( image.GetHorizontalResolution(), image.GetVerticalResolution() );

Gdiplus::Graphics *grPhoto = Gdiplus::Graphics::FromImage( &bmPhoto );
Gdiplus::Color colorW(255, 255, 255, 255);
grPhoto->Clear( colorW );
grPhoto->SetInterpolationMode( Gdiplus::InterpolationModeHighQualityBicubic );
grPhoto->DrawImage( &image, Gdiplus::Rect(destX, destY, destWidth, destHeight) );

bmPhoto.GetHBITMAP( colorW, &hbmReturn );

m_BitmapPreview.SetBitmap( hbmReturn ); // ---- without this line memory usage doesn't go up rapidly every second.

DeleteObject( hbmReturn ); // ---- returns non-zero which would point out that it was freed properly.
delete grPhoto;
}
void CAppDlg::UpdatePreview(常量RenderBuffer*RenderBuffer)
{
HBITMAP hbmReturn=NULL;
Gdiplus::Bitmap*bmPhoto=NULL;
位图bmPhoto(缩略图宽度、缩略图高度);
CBitmap-Bmp1;
Gdiplus::位图图像(780,780,4*780,像素格式32bpparGB,渲染缓冲->缓冲);
int sourceWidth=image.GetWidth();
int sourceHeight=image.GetHeight();
int destX=0,
destY=0;
浮动百分比=0;
float nPercentW=((float)缩略图宽度/(float)源宽度);;
浮点nPercentH=((浮点)缩略图高度/(浮点)源高度);
如果(nPercentHClear(彩色);
grPhoto->SetInterpolationMode(Gdiplus::InterpolationModeHighQualityBicubic);
grPhoto->DrawImage(&image,Gdiplus::Rect(destX,destY,destWidth,destWidth));
bmPhoto.GetHBITMAP(colorW和hbmReturn);
m_BitmapPreview.SetBitmap(hbmReturn);//----没有这一行,内存使用不会每秒快速增加。
DeleteObject(hbmReturn);//----返回非零值,指出它已被正确释放。
删除照片;
}
谢谢你的帮助

问候。

我想你应该使用

我认为代码应该是这样的:

// ..............
bmPhoto.GetHBITMAP( colorW, &hbmReturn );

HBITMAP prev = m_BitmapPreview.SetBitmap( hbmReturn ); // ---- without this line memory usage doesn't go up rapidly every second.
if (NULL != prev)
{
   DeleteObject(prev); // *** do not forget to delete the previously associated bitmap
}

DeleteObject( hbmReturn ); // ---- returns non-zero which would point out that it was freed properly.
// .........

非常感谢,尤连!我不知道还必须释放SetBitmap()返回的位图。我加上你的建议后,它就不再占用我所有的计算机资源了。谢谢你的帮助!