HBITMAP位图用LoadImage后怎么正确释放位图资源,防止内存泄漏?
HBITMAP位图用LoadImage后如何正确释放位图资源,防止内存泄漏???
大家好,帮忙看看关于位图资源释放的问题,谢谢!
(1)遇到的问题是:循环显示一段时间后,提示”程序内存非常不足,必须关闭“!我知道是内存泄漏了,但是不清除如何有效地释放位图资源,我怀疑的是DeleteObject(m_hAutoUpMotion);未释放成功。
(2)问题描述: MFC界面上CStatic控件上用定时器循环显示bmp图片IDB_UP_OFF,HBITMAP m_hAutoUpMotion为窗口类对象,在OnInitDialog()中初始化:
BOOL CAutoOperation::OnInitDialog()
{
...................
m_hAutoUpMotion=NULL;
m_hAutoUpMotionBmp=NULL;
....................
}
定时器处理函数:
void CAutoOperation::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nIDEvent)
{
case 1:
if (m_hAutoUpMotion==NULL)
{
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
else
{
DeleteObject(m_hAutoUpMotion);
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
m_pAutoUpMotion->ModifyStyle(0,SS_BITMAP);
if (m_hAutoUpMotionBmp==NULL)
{
m_hAutoUpMotionBmp=m_pAutoUpMotion->SetBitmap(m_hAutoUpMotion);
}
//释放资源
if (m_hAutoUpMotionBmp!=NULL)
{
DeleteObject(m_hAutoUpMotionBmp);
m_hAutoUpMotionBmp=NULL;
}
break;
default:
break;
}//end switch
CDialog::OnTimer(nIDEvent);
}
------解决思路----------------------
你的代码不止这些吧,否则不用每次去重新SetBitmap了。
如果就这段代码来说,实在没道理每次都去LoadImage,就算不泄露,也消耗啊。m_hAutoUpMotion应该是成员变量吧,为什么要删掉,而不长期保留呢?到对话框退出时在删除就够了啊
------解决思路----------------------
貌似已经释放了。DeleteObject就可以了啊
------解决思路----------------------
既然都是IDB_UP_OFF,为什么还要重复加载??
你和用局部变量有什么区别??
大家好,帮忙看看关于位图资源释放的问题,谢谢!
(1)遇到的问题是:循环显示一段时间后,提示”程序内存非常不足,必须关闭“!我知道是内存泄漏了,但是不清除如何有效地释放位图资源,我怀疑的是DeleteObject(m_hAutoUpMotion);未释放成功。
(2)问题描述: MFC界面上CStatic控件上用定时器循环显示bmp图片IDB_UP_OFF,HBITMAP m_hAutoUpMotion为窗口类对象,在OnInitDialog()中初始化:
BOOL CAutoOperation::OnInitDialog()
{
...................
m_hAutoUpMotion=NULL;
m_hAutoUpMotionBmp=NULL;
....................
}
定时器处理函数:
void CAutoOperation::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
switch(nIDEvent)
{
case 1:
if (m_hAutoUpMotion==NULL)
{
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
else
{
DeleteObject(m_hAutoUpMotion);
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
m_pAutoUpMotion->ModifyStyle(0,SS_BITMAP);
if (m_hAutoUpMotionBmp==NULL)
{
m_hAutoUpMotionBmp=m_pAutoUpMotion->SetBitmap(m_hAutoUpMotion);
}
//释放资源
if (m_hAutoUpMotionBmp!=NULL)
{
DeleteObject(m_hAutoUpMotionBmp);
m_hAutoUpMotionBmp=NULL;
}
break;
default:
break;
}//end switch
CDialog::OnTimer(nIDEvent);
}
------解决思路----------------------
你的代码不止这些吧,否则不用每次去重新SetBitmap了。
如果就这段代码来说,实在没道理每次都去LoadImage,就算不泄露,也消耗啊。m_hAutoUpMotion应该是成员变量吧,为什么要删掉,而不长期保留呢?到对话框退出时在删除就够了啊
------解决思路----------------------
貌似已经释放了。DeleteObject就可以了啊
------解决思路----------------------
if (m_hAutoUpMotion==NULL)
{
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
else
{
DeleteObject(m_hAutoUpMotion);
m_hAutoUpMotion=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),MAKEINTRESOURCE(IDB_UP_OFF),IMAGE_BITMAP,0,0,0);
}
既然都是IDB_UP_OFF,为什么还要重复加载??
if (m_hAutoUpMotionBmp==NULL)
{
m_hAutoUpMotionBmp=m_pAutoUpMotion->SetBitmap(m_hAutoUpMotion);
}
//释放资源
if (m_hAutoUpMotionBmp!=NULL)
{
DeleteObject(m_hAutoUpMotionBmp);
m_hAutoUpMotionBmp=NULL;
}
你和用局部变量有什么区别??