CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

关于内存泄漏的问题,高手请进,送分多多!!!

楼主jjiaming(阿熊)2005-08-04 14:43:11 在 VC/MFC / 基础类 提问

小弟最近在做一个小项目,现在遇到了很棘手的内存泄漏问题。当程序激活时,占用的内存有10多M,而当程序最小化之后,占用的内存只有五M左右,是不是OnDraw函数中有内存泄漏啊(界面上有32个Gif,使用的CPictureEx类),当程序运行了十个小时左右,程序战胜的内存就激增至120多M!!!!测试时,我每0.05秒查询一次数据库,并更新MSFlexGrid中的数据,发现内存每一秒就多占用4K多的内存,这个问题怎么解决啊。急急急,项目只有几天就要交付使用了,问题还有一大堆。小弟另外开了一个贴,是关于网络的  
  http://community.csdn.net/Expert/topic/4188/4188688.xml?temp=.6668207  
  请大家多多关注小弟的帖子,小弟有一千多分,大家不要担心分的问题 问题点数:100、回复次数:13Top

1 楼slek(我浮躁,可是我很厚道!)回复于 2005-08-04 14:48:56 得分 16

程序运行了10个小时才涨到120M,说明有小量的内存没释放,不知道是不是数据库那里的问题。Top

2 楼twinboys()回复于 2005-08-04 14:50:50 得分 16

能不能说的细一点,可以是内存泄露Top

3 楼honker110(honker)回复于 2005-08-04 14:55:35 得分 17

0.05秒就查询一次数据库也太频繁了吧?  
  不过这么频繁查询倒不像是这里的问题,应该是别的地方泄漏了吧?Top

4 楼dirdirdir3(风)回复于 2005-08-04 14:58:11 得分 20

使用boundschecker查查哪里出了问题啊。Top

5 楼jjiaming(阿熊)回复于 2005-08-04 14:59:22 得分 0

CRect   rect   ;  
   
  GetClientRect(&rect);  
  int   nWidth,nHeight;  
  rect.top   +=   TopExtra;  
  nWidth   =   (rect.Width()   -   nEWidth   *   (   nColumn   +   1))   /   nColumn   ;  
  nHeight   =   rect.Height()   /   nRow   -   nEHeight;  
   
  int   count   =   0;  
  int   count1   =   20;  
  int   start   ,end;  
  if(nCurScreen   ==   0   )  
  {  
  start     =   0   ;  
  end     =   4;  
  }  
  else    
  {  
  start   =   4;  
  end   =     8;  
  }  
   
  for(int   i   =   start;   i   <   end;   i++)  
  {  
  for(int   j   =   0   ;   j   <   nColumn;   j   ++)  
  {  
  CRect   TempRect,PicRect;  
  TempRect.left   =   (j   +   1)   *   nEWidth   +   j   *   nWidth;  
  TempRect.right   =   TempRect.left   +   nWidth;  
  TempRect.top   =   (i   +   1   )   *   nEHeight   +   i   *   nHeight   +   TopExtra;  
  TempRect.bottom   =   TempRect.top   +   nHeight;  
   
  PicRect   =   TempRect;  
  PicRect.top         +=   25;  
  PicRect.bottom   -=   25;  
                                    TempRect.top   -=   3;    
  if(false   ==   bMoved   )  
  {  
              if(count1     <   32)     {  
      ((CWnd*)&m_gif[   count1   +   1])->MoveWindow(PicRect.left   +   3,  
      PicRect.top,   PicRect.Width(),PicRect.Height());  
          m_gif[count1   +   1].Stop();  
      }  
                                      else    
      ((CWnd*)GetDlgItem(IDC_STATIC301   +   count1   -   32))   ->MoveWindow(  
      PicRect.left   +   3,  
      PicRect.top,  
      PicRect.Width(),  
      PicRect.Height());  
   
      ((CWnd*)GetDlgItem(IDC_STATIC1   +   count))->SetWindowPos(&wndTop,TempRect.left,  
  TempRect.top   -   5   ,TempRect.Width(),TempRect.Height()   +   5,SWP_SHOWWINDOW);  
                               
   
    ((CWnd*)GetDlgItem(IDC_STATIC101   +   count))->SetWindowPos(&wndTop,TempRect.left   +   3,  
  TempRect.top   +   5,TempRect.Width()   -   4,25,SWP_SHOWWINDOW);  
   
                              ((CWnd*)GetDlgItem(IDC_STATIC201   +   count))->SetWindowPos(&wndTop,TempRect.left   +   3,  
    PicRect.bottom   +   4,PicRect.Width()   -     4   ,14,SWP_SHOWWINDOW);  
   
                                    ((CWnd*)&m_gif[   count   +   1])->SetWindowPos(&wndTop,PicRect.left   +   3,PicRect.top,  
          PicRect.Width(),PicRect.Height(),SWP_SHOWWINDOW);  
                                    m_gif[count   +   1].Stop();  
   
   
  }  
     
  if(map[i][j]   !=   NULL)  
  {  
  CString   DevName   =   map[i][j]->GetDevName();  
  //dc->TextOut(TempRect.left   +   4,TempRect.top   +   7,DevName);  
  ((CWnd*)GetDlgItem(IDC_STATIC101   +   count))->SetWindowText(DevName);  
    if(map[i][j]->GetDevType()   ==   1)  
  {  
  int   times   =   map[i][j]->GetTimes();  
  CString   str;  
  str.Format("钩数:%d次",times);  
  // dc->TextOut(PicRect.left   +   4,   PicRect.bottom   +   4,str);  
  ((CWnd*)GetDlgItem(IDC_STATIC201   +   count))->SetWindowText(str);  
  }  
  else   if(map[i][j]->GetDevType()   ==   5)  
  {  
  int   times   =   map[i][j]->GetTimes();  
  CString   str;  
  str.Format("次数:%d次",times);  
  ((CWnd*)GetDlgItem(IDC_STATIC201   +   count))->SetWindowText(str);  
  }  
  else    
  {  
  int   hour,min,sec;  
    map[i][j]->GetTime(&hour,&min,&sec);  
  CString   str;  
  str.Format("累计时间:%d%d:%d%d:%d%d",hour/10,hour%10,min/10,min%10,sec/10,sec%10);  
  ((CWnd*)GetDlgItem(IDC_STATIC201   +   count))->SetWindowText(str);//dc->TextOut(PicRect.left   +   4,   PicRect.bottom   +   4,str);  
  }  
  }  
  else    
  {  
  ((CWnd*)GetDlgItem(IDC_STATIC201   +   count))->SetWindowText("");  
          ((CWnd*)GetDlgItem(IDC_STATIC101   +   count))->SetWindowText("没有设备");  
   
  }  
                            count++;  
    count1++;  
  }  
   
  }  
  if(bMoved   ==   false)  
  {                  
          DataManage.StartWork(this);  
         
            bMoved   =   true;  
   
  }Top

6 楼lixiaosan(小三)回复于 2005-08-04 15:01:05 得分 16

检查一下你的cdc的一些资源是否释放,  
   
  也只是猜测..Top

7 楼jjiaming(阿熊)回复于 2005-08-04 15:01:47 得分 0

不好意思,代码太乱,这是OnDraw()的代码Top

8 楼jjiaming(阿熊)回复于 2005-08-04 15:03:03 得分 0

CString   strSQL,strDate;  
  strDate.Format("#%d-%d-%d#",year,month,day);  
          strSQL   .Format("select     总次数,总开机时间,设备地址   from   DayData   where   日期   =%s   ",strDate);  
  BSTR   bstrSQL   =   strSQL.AllocSysString();  
  try{  
                  int   i   =   1;  
  _variant_t   TheValue;   //VARIANT数据类型  
  CString   value;  
  if   (m_pRecordset   !=   NULL   &&   m_pRecordset->GetState()   ==   adStateOpen)  
  m_pRecordset->Close();  
   
                  m_pRecordset->Open(bstrSQL,(IDispatch*)m_pConn,  
                          adOpenDynamic,adLockReadOnly,adCmdText);    
  while(!m_pRecordset->adoEOF)//遍历所有记录  
  {    
                          value.Format("%d",i);  
          TheValue.vt   =   VT_NULL;  
  TheValue   =   m_pRecordset->GetCollect("设备地址");  
  if(TheValue.vt!=VT_NULL)  
  {  
  value   =   (LPCTSTR)(_bstr_t)TheValue;  
  FlexGrid->SetTextMatrix(i,2,value);  
  int   id   =   atoi(value);  
  FlexGrid->SetTextMatrix(i,1,Device[id].GetDevName());  
  }  
   
   
  TheValue.vt   =   VT_NULL;  
  TheValue   =   m_pRecordset->GetCollect("总次数");  
  if(TheValue.vt   !=   VT_NULL)  
  {  
  value   =   (LPCTSTR)(_bstr_t)TheValue;  
  FlexGrid->SetTextMatrix(i,3,value);  
  }  
                            else   FlexGrid->SetTextMatrix(i,3,"     -     ");  
                          TheValue.vt   =   VT_NULL;  
  TheValue   =   m_pRecordset->GetCollect("总开机时间");  
  if(TheValue.vt   !=   VT_NULL)  
  {  
  value   =   (LPCTSTR)(_bstr_t)TheValue;  
  FlexGrid->SetTextMatrix(i,4,value);  
  }  
                            else   FlexGrid->SetTextMatrix(i,4,"     -     ");  
    m_pRecordset->MoveNext();  
    i++;  
  }  
  m_pRecordset->Close();  
  if(   i   ==   1)  
  {  
  CString   str;  
  str.Format("对不起,没有%d年%d月%d日的数据!",year,month,day);  
  AfxMessageBox(str);  
  }  
              ::SysFreeString(bstrSQL);  
      return   true;  
  }  
  catch(_com_error   e)  
  {  
  if   (m_pRecordset   !=   NULL   &&   m_pRecordset->GetState()   ==   adStateOpen)  
  m_pRecordset->Close();  
  ::SysFreeString(bstrSQL);  
  AfxMessageBox(e.ErrorMessage());  
  return   false;  
  }  
  这是数据库访问的代码Top

9 楼jjiaming(阿熊)回复于 2005-08-04 15:08:02 得分 0

当程序由最大化后,内存慢慢地由5K左右增至12K左右,然后会缓慢地增加。关于CDC的资源,有一个CBrush,然后就是有32个CPictureEx对象,几个font对象,几个CBitmap 对象,都只分配了一次,我注意了new与delete是没有问题的,可能是其它隐性泄漏吧Top

10 楼boyplayee()回复于 2005-08-04 15:08:39 得分 15

检查一下,有没有用过delete...Top

11 楼jjiaming(阿熊)回复于 2005-08-04 15:10:05 得分 0

大家有没有用过CpictureEx啊,不会是这个有问题吧。Top

12 楼jjiaming(阿熊)回复于 2005-08-04 15:11:14 得分 0

用了啊,但都是在程序结束时用的啊Top

13 楼jjiaming(阿熊)回复于 2005-08-04 15:30:19 得分 0

大家说说一般内存的泄漏发生在什么地方Top

相关问题

  • 内存泄漏问题!高手请进, 急! 马上给分!!!!!!!!!!!!
  • 内存泄漏,参与有分!
  • 进程内存泄漏的问题
  • maddam、Hankuu请进,重新给分。100分求助:如何解决内存泄漏,代码如下(无内容)
  • =★=C++ Builder 5 和 6中VCL的一个内存泄漏 BUG,我送200分,希望大家继续讨论!
  • 高分求救:奇怪的内存泄漏?
  • CRT Blocks部分的内存泄漏是由什么引起的???
  • 100分求助:如何解决内存泄漏,代码如下
  • 高分求解 - TOMCAT中的内存泄漏问题……
  • 这个很短的函数有内存泄漏吗?200分!

关键词

  • 内存
  • 内存泄漏
  • idc
  • 数据库
  • 查询
  • sec
  • picrect
  • temprect
  • getdlgitem
  • cwnd

得分解答快速导航

  • 帖主:jjiaming
  • slek
  • twinboys
  • honker110
  • dirdirdir3
  • lixiaosan
  • boyplayee

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo