释放在MFC中使用Image.load方法分配的内存

时间:2014-07-21 13:44:33

标签: mfc

在MFC中,我正在加载一个.PNG图像,然后,我用静态控件显示它,如下所示:

CImage Img;
Img.Load(_T(abc.png"));
CBitMap Bmp;
Bmp.Attach(Img.Detach());
CStatic dispImg;
dispImg.SetBitmap(Bmp);

通过这种方式,我有几个图像,我正在重复显示静态控件 这导致我的应用程序中出现大量内存泄漏。我通过谷歌搜索发现了一些线索,但我无法决定释放内存的最佳选择。有人可以用最好的方法指导我。

4 个答案:

答案 0 :(得分:0)

  1. 此代码不完整。以这种方式使用CStatic永远不会奏效。它没有创建。 如果你真的想要帮助那些问题,请提供更详细的说明。
  2. 当您使用CStatic :: SetBitmap时,ypu必须释放该函数返回的HBITMAP句柄。请阅读docs。因此,如果您在循环中使用此samne CStatic并始终为CStatic分配新的位图,则可能会导致泄漏。

答案 1 :(得分:0)

正如xMRi建议我释放CStatic :: SetBitmap返回的HBITMAP句柄。在我的测试应用程序中有一个CStatic控件成员m_pic,一个方法ChangePic,它设置一个位图和一个按钮控件,用于根据布尔变量SetBlueImg的值更改图像。 ChangePic的定义如下:

void CPNGTestDlg::ChangePic(Cstring img)
{
CImage Img;
Img.Load(img);
CBitmap Bmp;
Bmp.Attach(Img.Detach());
HBITMAP hBmp=m_pic.SEtBitmap(Bmp);
if(hBmp!=NULL) DeleteObject(hBmp);
}

按钮的点击事件定义如下:

void CPNGTest::OnBnClickedChngPic()
{
if(SetBlueImg)
{
ChangePic(_T("Blue.png"));
SetBlueImg=false;
}
else
{
ChangePic(_T("Red.png"));
SetBlueImg=true;
}
}

SetBlueImg = true的初始值,在OnInitDialog()中我调用了ChangePic(_T(“Red.png”));

我运行应用程序并不断点击按钮来更改当前图像,但我仍然可以通过Windows任务管理器看到内存泄漏。单击按钮40/50次或有时无法预测后,内存的远足量为4KB。请指出我遗漏了导致泄漏的地方。

答案 2 :(得分:0)

为了在将静态控件上的一个图像替换为另一个图像时摆脱重叠的图像,我最初遵循以下步骤:

  1. 的ShowWindow(SW_HIDE)
  2. SetBitmap()
  3. 的ShowWindow(SW_SHOW)
  4. 但我不知道这是否是解决图像重叠的正确方法。我通过谷歌搜索了一下,发现了以下方式:

    1. 在第一次绘制静态控件后面的父窗口上复制区域。
    2. 每次需要重绘静态控件时,将图像复制回父级。

答案 3 :(得分:0)

对话框销毁时,必须删除HBITMAP对象。

void CMFCAppDlg::OnDestroy()
{
CDialogEx::OnDestroy();
DeleteObject(m_pic.GetBitmap());
}