CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

高分请教:内存泄漏问题

楼主yybb526(我快毕业了)2006-07-03 16:43:31 在 VC/MFC / 基础类 提问

我在OnTimer里每三秒执行一次下面的ShowState函数来判断一个服务程序的状态(启动类型,状态),  
  在任务管理器中这个进程大约每隔10秒总会增加4k的内存,在debug模式下,  
  没有发现内存泄漏,如果把OnTimer中的ShowState();去掉,不会出现增加4k内存的情况  
   
  问题是:ShowState为什么会这样,那段代码为什么会不断增加4k的内存   要怎么改正   ?  
   
  代码如下:  
   
  void   CARServerCtrlDlg::OnTimer(UINT   nIDEvent)    
  {  
  //   TODO:   Add   your   message   handler   code   here   and/or   call   default  
  ShowState();  
  CDialog::OnTimer(nIDEvent);  
  }  
   
   
  void   CARServerCtrlDlg::ShowState()  
  {  
  DWORD   dwState=0;//xFFFFFFFF;  
  DWORD   dwStartType=0;//xFFFFFFFF;  
  DWORD   dwErr=0;//xFFFFFFFF;  
   
  //   open   the   service   control   manager  
  SC_HANDLE   hSCM=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);  
  ASSERT(hSCM);  
   
  //   open   the   service    
  SC_HANDLE   hService=OpenService(hSCM,SERVICENAME,SERVICE_ALL_ACCESS);  
  if   (hService)  
  {  
  //   Get   the   current   status  
  SERVICE_STATUS   m_ServiceState;  
  memset(&m_ServiceState,0,sizeof(m_ServiceState));  
   
  LPQUERY_SERVICE_CONFIG   m_pQSC;  
  memset(&m_pQSC,0,sizeof(m_pQSC));  
  DWORD   dwSize;  
  m_pQSC=(LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,1024);  
  if   (!QueryServiceStatus(hService,&m_ServiceState)||!QueryServiceConfig(hService,m_pQSC,1024,&dwSize))  
  {  
  dwErr=GetLastError();  
  ASSERT(0);  
  }  
  else  
  {  
  dwErr=m_ServiceState.dwWin32ExitCode;  
  dwState=m_ServiceState.dwCurrentState;  
   
  DWORD   dwStartType=m_pQSC->dwStartType;  
  switch(dwStartType)  
  {  
  case   SERVICE_DISABLED:  
  ((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(2);  
  break;  
  case   SERVICE_DEMAND_START:  
  ((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(1);  
  break;  
  default:  
  ((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(0);  
  }  
   
  //   if   the   service   is   running,send   a   control   request  
  //   to   get   its   current   status.  
  if   (dwState==SERVICE_RUNNING)  
  {  
  if   (::ControlService(hService,SERVICE_CONTROL_INTERROGATE,&m_ServiceState))  
  {  
  dwErr=m_ServiceState.dwWin32ExitCode;  
  dwState=m_ServiceState.dwCurrentState;  
  }  
  }  
  }  
   
  //close   the   service   handle  
  CloseServiceHandle(hService);  
  hService=NULL;  
  }  
  //   close   the   service   control   manager   handle  
  CloseServiceHandle(hSCM);  
  hSCM=NULL;  
   
  //    
  char   buf[64];  
  switch(dwState)  
  {  
  case   SERVICE_RUNNING:  
  strcpy(buf,"正在运行   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(TRUE);  
  GetDlgItem(IDC_PORT)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_BROWSER)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_runing;  
  break;  
  case   SERVICE_PAUSED:  
  strcpy(buf,"已暂停   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(TRUE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_none;  
  break;  
  case   SERVICE_STOPPED:  
  strcpy(buf,"已停止   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(TRUE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_PORT)->EnableWindow(TRUE);  
  GetDlgItem(IDC_BTN_BROWSER)->EnableWindow(TRUE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_stop;  
  break;  
  case   SERVICE_START_PENDING:  
  strcpy(buf,"正在启动   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_none;  
  break;  
  case   SERVICE_STOP_PENDING:  
  strcpy(buf,"正在停止   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_none;  
  break;  
  case   SERVICE_CONTINUE_PENDING:  
  strcpy(buf,"正在继续   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_none;  
  break;  
  case   SERVICE_PAUSE_PENDING:  
  strcpy(buf,"正在暂停   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("卸载服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(TRUE);  
  m_State=state_none;  
  break;  
  default:  
  strcpy(buf,"未安装   -   Online   services");  
  SetDlgItemText(IDC_BTN_SETUP,_T("安装服务"));  
  GetDlgItem(IDC_BTN_START)->EnableWindow(FALSE);  
  GetDlgItem(IDC_BTN_STOP)->EnableWindow(FALSE);  
  ((CComboBox*)GetDlgItem(IDC_STARTTYPE))->SetCurSel(0);  
  GetDlgItem(IDC_STARTTYPE)->EnableWindow(FALSE);  
  m_State=state_none;  
  }  
  //   显示在状态栏  
  m_wndStatusBar.SetPaneText(0,buf);  
   
  //   显示在托盘的tip  
  lstrcpyn(m_Notify.szTip,buf,sizeof(m_Notify.szTip));  
  Shell_NotifyIcon(NIM_MODIFY,&m_Notify);  
  }  
  问题点数:100、回复次数:15Top

1 楼gaooo(像男人一样去战斗www.sawin.cn)回复于 2006-07-03 16:51:41 得分 10

The   LocalAlloc   function   allocates   the   specified   number   of   bytes   from   the   heap.   To   free   the   memory,   use   the   LocalFree   function.Top

2 楼goodboyws(深夜不眠者(VCMVP))回复于 2006-07-03 17:10:29 得分 15

m_pQSC没释放?Top

3 楼yisong_net(李松)回复于 2006-07-03 17:11:26 得分 8

看楼主的水平,应该不会犯这样的错误.....  
  Top

4 楼yybb526(我快毕业了)回复于 2006-07-03 17:23:24 得分 0

呵呵,不好意思啊,别人给我的代码,我以为很难,还没看就贴上来了,仔细一看,才发现申请的内存没释放,不好意思啊,各位。我太冲动了。Top

5 楼thisisll(学习王高李,有个好身体)回复于 2006-07-03 17:24:44 得分 5

冲动是魔鬼  
  接分Top

6 楼yefu2000(野夫)回复于 2006-07-03 17:31:21 得分 5

看来都解决了,接分,呵呵Top

7 楼lwsogood(深入学习C++)回复于 2006-07-03 17:44:20 得分 5

jf,没得发挥下Top

8 楼BLsoft(網龍ζ龍活)(Cyber-Security of [MVP])回复于 2006-07-03 18:29:57 得分 5

You   had   disremember   read-in   LocalFree()   on   the   your   ARServerCtrlDlg.ccpTop

9 楼tong20037(小菜)回复于 2006-07-03 18:50:10 得分 5

估计解决了,接分Top

10 楼coolzdp(unreal张师傅)回复于 2006-07-03 18:54:26 得分 5

有情upTop

11 楼xqk(夏乾坤)回复于 2006-07-03 19:14:12 得分 5

估计解决了,接分  
  Top

12 楼whwjn(哈哈)回复于 2006-07-03 19:39:10 得分 5

估计解决了,接分Top

13 楼lisypro()回复于 2006-07-03 20:43:47 得分 5

upTop

14 楼yanzi5897(燕子)回复于 2006-07-03 21:28:44 得分 22

这么热闹,我也来。Top

15 楼yybb526(我快毕业了)回复于 2006-07-03 21:30:06 得分 0

这么多人啊,被分吸引而来啊,我还是早点揭帖好了Top

相关问题

关键词

得分解答快速导航

  • 帖主:yybb526
  • gaooo
  • goodboyws
  • yisong_net
  • thisisll
  • yefu2000
  • lwsogood
  • BLsoft
  • tong20037
  • coolzdp
  • xqk
  • whwjn
  • lisypro
  • yanzi5897

相关链接

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

广告也精彩

反馈

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