一个画图程序内存泄露,高手给看下,附有源码

kongxin12 2008-12-16 03:34:06
void COScopeCtrl::InvalidateCtrl()
{
_CrtDumpMemoryLeaks();
//初始化参数
//初始化位置参数
CBrush *oldbrush;
CPen *oldPen ;
CRect rect[7];
// rect=new CRect[7];

CString strTemp ;
double numtemp;
double numinterval;
//填充CRgn的画刷
CBrush brA, brB;
//设置字体颜色
CFont nunberfont, *oldFont ;
CFont nunberfont1;
CFont nunberfont2;
// 绘制刻度变量
int i,x5,y5,x6,y6;
int biger_interval=4; //大刻度数
//绘制屏蔽线
CPen temppen/*,temppen1*/;
//绘制边框
CPen form_pen;
//表盘边界
int x1,x2,x3,x4,y1,y2,y3,y4;
SetCentre();
CheckB();

.......

// in case we haven't established the memory dc's
CClientDC dc(this) ;

// if we don't have one yet, set up a memory dc for the grid
if (m_dcindex.GetSafeHdc() == NULL)
{
m_dcindex.CreateCompatibleDC(&dc) ; //内存DC
m_bitmapidex.CreateCompatibleBitmap(&dc, m_rectClient.right-m_rectClient.left, m_rectClient.bottom-m_rectClient.top) ;
m_pbitmapOldindex = m_dcindex.SelectObject(&m_bitmapidex) ;
}
else
{
m_dcindex.SelectObject(m_pbitmapOldindex);
m_dcindex.DeleteDC();
m_bitmapidex.DeleteObject();
m_pbitmapOldindex->DeleteObject();

m_dcindex.CreateCompatibleDC(&dc) ; //内存DC
m_bitmapidex.CreateCompatibleBitmap(&dc, m_rectClient.right-m_rectClient.left, m_rectClient.bottom-m_rectClient.top) ;
m_pbitmapOldindex = m_dcindex.SelectObject(&m_bitmapidex) ;

}
// m_dcindex.CreateCompatibleDC(&dc) ; //内存DC
// m_bitmapidex.CreateCompatibleBitmap(&dc, m_rectClient.right-m_rectClient.left, m_rectClient.bottom-m_rectClient.top) ;
// m_pbitmapOldindex = m_dcindex.SelectObject(&m_bitmapidex) ;

m_dcindex.SetBkColor (m_crBackColor) ;
m_dcindex.FillRect(m_rectClient, &m_brushBack) ;
...全文
183 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
路人乙2019 2008-12-27
  • 打赏
  • 举报
回复
new的东西未delete?
灿烂李 2008-12-26
  • 打赏
  • 举报
回复
oldPen->DeleteObject();
form_pen.DeleteObject();

主要是这些函数 你跟踪下 他们的返回值,有的函数调用完了 但返回值没成功,说明释放没成功
梧桐168 2008-12-17
  • 打赏
  • 举报
回复
封装GDI对象,在构造函数中分配资源,在析构函数中释放资源,省了好多事,也不容易出错。
zhucde 2008-12-16
  • 打赏
  • 举报
回复
这么长,看的都头晕, 先调试吧.
ccc_cgreen 2008-12-16
  • 打赏
  • 举报
回复
内存
cnzdgs 2008-12-16
  • 打赏
  • 举报
回复
DeleteObject之前要先用SelectObject将要删除的对象选出,否则会删除失败。
jyh_baoding 2008-12-16
  • 打赏
  • 举报
回复
句柄或内存的释放,这要仔细调试一下!
C_MFC 2008-12-16
  • 打赏
  • 举报
回复
你的内存泄露,不能定位到源代码么?是不是文件是自己添加的,不是VC给添加的?
如果自己添加的文件,要加:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
这样就能定位到内存泄露的代码行了!
你这里面没有申请空间,只有一些GDI资源的申请,你只要将这些资源释放即可!
wap21 2008-12-16
  • 打赏
  • 举报
回复
up
kongxin12 2008-12-16
  • 打赏
  • 举报
回复
接楼上,主要是绘图,程序有点长
if (m_Crgn_flag)
{
m_rgn1.DeleteObject();
m_rgn2.DeleteObject();
m_rgn3.DeleteObject();
m_rgn4.DeleteObject();
m_Crgn_flag=false;
}
CPoint ptVertex1[3];
CPoint ptVertex2[3];
CPoint ptVertex3[3];
CPoint ptVertex4[3];

..........算法过程

m_Crgn_flag=true;
/*CBrush brA, brB;*/
brA.CreateSolidBrush( RGB(192,192, 200) )/*)*/; // rgnA Red
brB.CreateSolidBrush( RGB(153,153, 153) )/*)*/; // Blue
m_dcindex.FillRgn( &m_rgn1, &brA/*, 2, 2*/ )/*)*/;
m_dcindex.FrameRgn( &m_rgn1, &brB, 1, 1 )/*)*/;
m_dcindex.FillRgn( &m_rgn2, &brA/*, 2, 2*/ )/*)*/;
m_dcindex.FrameRgn( &m_rgn2, &brB, 1, 1 )/*)*/;
m_dcindex.FillRgn( &m_rgn3, &brA/*, 2, 2*/ )/*)*/;
m_dcindex.FrameRgn( &m_rgn3, &brB, 1, 1 )/*)*/;
m_dcindex.FillRgn( &m_rgn4, &brA/*, 2, 2*/ )/*)*/;
m_dcindex.FrameRgn( &m_rgn4, &brB, 1, 1 )/*)*/;

brA.DeleteObject();
brB.DeleteObject();
//输出字体
/*CFont nunberfont1;*/
nunberfont1.CreateFont (
.......
) ;
oldFont = m_dcindex.SelectObject(&nunberfont1) ;
m_dcindex.SetTextColor (RGB(0,0,0)) ;

m_dcindex.TextOut(m_rectClient.left+/*(m_rectClient.right-m_rectClient.left)/2-strlen(m_strtitle)*4*/5,m_rectClient.top+5/*bottom-20*/,m_strtitle);

m_dcindex.SelectObject(oldFont);
oldFont->DeleteObject();
nunberfont1.DeleteObject();

/* CFont nunberfont2;*/
nunberfont2.CreateFont (
...........
) ;
oldFont=m_dcindex.SelectObject(&nunberfont2) ;
m_dcindex.SetTextColor (RGB(0,0,0)) ;

m_dcindex.TextOut(m_rectClient.left+strlen(m_strtitle)*9+5+3/*m_rectClient.right-strlen("当前值:")*6*/,m_rectClient.top+6/*m_rectClient.bottom-33*/,"当前值:");
m_dcindex.TextOut(m_rectClient.left+strlen(m_strtitle)*9+5+3+strlen("当前值:")*8/*m_rectClient.right-strlen("当前值:")*8*/,m_rectClient.top+6/*m_rectClient.bottom-20*/,m_strvalue+m_unit);

m_dcindex.SelectObject(oldFont);
oldFont->DeleteObject();
nunberfont2.DeleteObject();
//定义字体
nunberfont.CreateFont (
..............
) ;
oldFont = m_dcindex.SelectObject(&nunberfont) ;
m_dcindex.SetTextColor (RGB(255,0,0)) ;

m_dcindex.SelectObject(oldFont);
oldFont->DeleteObject();
nunberfont.DeleteObject();

// 绘制刻度,顺时针绘制
// int i,x5,y5,x6,y6;
// int biger_interval=4;
int tempy=m_rectClient.top;
int tempx=m_rectClient.right-5;
numinterval=(m_maxvalue-m_minvalue)/biger_interval; //4 is number of biger interval
oldPen = m_dcindex.SelectObject (&m_scalePen) ;

bool pre=false;
for (i=0;i<=m_scalenumber;i++)
{
......算法过程
}

m_dcindex.SelectObject(oldPen);
oldPen->DeleteObject();

//绘制扇形覆盖区
oldbrush=m_dcindex.SelectObject(&m_brushBack);
m_dcindex.Pie(x1,y1,x2,y2,x3,y3,x4,y4);
//屏蔽边线
/*CPen temppen,temppen1;*/
temppen.CreatePen(PS_SOLID,4,RGB(255,255,255));
oldPen=m_dcindex.SelectObject(&temppen);
.......算法过程

m_dcindex.SelectObject(oldPen);
oldPen->DeleteObject();
temppen.DeleteObject();

m_dcindex.SelectObject(oldbrush);
oldbrush->DeleteObject();
form_pen.CreatePen(PS_SOLID,4,RGB(96,96,96));
oldPen=m_dcindex.SelectObject(&form_pen);
............算法过程
m_dcindex.SelectObject(oldPen);
oldPen->DeleteObject();
form_pen.DeleteObject();

form_pen.CreatePen(PS_SOLID,4,RGB(217,217,217));
oldPen=m_dcindex.SelectObject(&form_pen);
............算法过程

m_dcindex.SelectObject(oldPen);
oldPen->DeleteObject();
form_pen.DeleteObject();

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧