高分请教:内存泄漏问题
我在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




