这段代码哪边需要释放啊有内存泄露,怎么释放
这段代码哪边需要释放啊?有内存泄露,如何释放
Locked=true;
try
{ if(pDC==NULL)
return;
Graphics g(pDC->m_hDC);
//图的坐标(含外框)
CRect rt;
pDC->GetWindow()->GetClientRect(&rt);
GraphT=rt.top+MarginGraphT;
GraphB=rt.bottom-MarginGraphB;
GraphL=rt.left+MarginGraphL;
GraphR=rt.right-MarginGraphR;
//计算区域(不含外框)
xSrc=GraphL+MarginL;
ySrc=GraphB-MarginB;
xWidth=(GraphR-MarginR)-(GraphL+MarginL);
yHeight=(GraphB-MarginB)-(GraphT+MarginT);
Bitmap bmp(rt.Width(),rt.Height());
DrawAxis(&bmp,GraphType);
//画下面的三个颜色示例
if(GraphType==0)
{
DrawLegend(&bmp);
}
if(DataCount!=0)
{
//画图
switch(GraphType)
{
case 0:
//画线
DrawLineChart(&bmp);
break;
case 1:
DrawBarChart(&bmp);
break;
case 2:
DrawLineChartByPos(&bmp);
default:
break;
}
}
//g.DrawImage(&bmp,0,0,GraphR-GraphL+100,GraphB-GraphT+100);
HBITMAP hbmp;
bmp.GetHBITMAP(Color(255, 255,255, 255),&hbmp);
CBitmap *pbmp=CBitmap::FromHandle(hbmp);
if(!pbmp)
{
exit(0);
}
BITMAP bmpInfo;
pbmp->GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(pbmp);
pDC->BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
pbmp->DeleteObject();
dcMemory.SelectObject(pOldBitmap);
}
catch(...)
{
}
Locked=false;
------解决方案--------------------
一方面你调用了一些函数,不知道这些函数中有没有泄漏的地方。
另外包括dcMemory没有显式的释放
还有就是
if(!pbmp)
{
exit(0);
}
太强悍了。
另外你的catch什么也没干,一旦try中有异常,那么其中申请的资源,就不能得到释放。
------解决方案--------------------
dcMemory.DeleteDC();
------解决方案--------------------
另外,你要弄清楚 RelaseDc 和 DeleteDC 的区别呀!
凡是Get出来的DC,如GetDC、GetWindowDC 等等,释放的时候要用 RelaseDc
凡是new出来的DC,如CreateDC、CreateCompatibleDC等等,释放的时候要用 DeleteDC
Locked=true;
try
{ if(pDC==NULL)
return;
Graphics g(pDC->m_hDC);
//图的坐标(含外框)
CRect rt;
pDC->GetWindow()->GetClientRect(&rt);
GraphT=rt.top+MarginGraphT;
GraphB=rt.bottom-MarginGraphB;
GraphL=rt.left+MarginGraphL;
GraphR=rt.right-MarginGraphR;
//计算区域(不含外框)
xSrc=GraphL+MarginL;
ySrc=GraphB-MarginB;
xWidth=(GraphR-MarginR)-(GraphL+MarginL);
yHeight=(GraphB-MarginB)-(GraphT+MarginT);
Bitmap bmp(rt.Width(),rt.Height());
DrawAxis(&bmp,GraphType);
//画下面的三个颜色示例
if(GraphType==0)
{
DrawLegend(&bmp);
}
if(DataCount!=0)
{
//画图
switch(GraphType)
{
case 0:
//画线
DrawLineChart(&bmp);
break;
case 1:
DrawBarChart(&bmp);
break;
case 2:
DrawLineChartByPos(&bmp);
default:
break;
}
}
//g.DrawImage(&bmp,0,0,GraphR-GraphL+100,GraphB-GraphT+100);
HBITMAP hbmp;
bmp.GetHBITMAP(Color(255, 255,255, 255),&hbmp);
CBitmap *pbmp=CBitmap::FromHandle(hbmp);
if(!pbmp)
{
exit(0);
}
BITMAP bmpInfo;
pbmp->GetBitmap(&bmpInfo);
CDC dcMemory;
dcMemory.CreateCompatibleDC(pDC);
CBitmap* pOldBitmap = dcMemory.SelectObject(pbmp);
pDC->BitBlt(0,0,bmpInfo.bmWidth,bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
pbmp->DeleteObject();
dcMemory.SelectObject(pOldBitmap);
}
catch(...)
{
}
Locked=false;
------解决方案--------------------
一方面你调用了一些函数,不知道这些函数中有没有泄漏的地方。
另外包括dcMemory没有显式的释放
还有就是
if(!pbmp)
{
exit(0);
}
太强悍了。
另外你的catch什么也没干,一旦try中有异常,那么其中申请的资源,就不能得到释放。
------解决方案--------------------
dcMemory.DeleteDC();
------解决方案--------------------
另外,你要弄清楚 RelaseDc 和 DeleteDC 的区别呀!
凡是Get出来的DC,如GetDC、GetWindowDC 等等,释放的时候要用 RelaseDc
凡是new出来的DC,如CreateDC、CreateCompatibleDC等等,释放的时候要用 DeleteDC