高分请教:内存泄漏问题

yybb526 yybb526 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我在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);
}
...全文

相关推荐

IAR EW8051-EV-730B 完美破解版

IAR EW8051-EV-730B 完美破解版,适用于8051内核单片机开发,适合ZigBee无线芯片CC2430的开发。内有IAR安装程序、注册机及破解文档说明!

Gloria406

IAR软件(EW8051-EV-Web-8101.exe)

EW8051-EV-Web-8101.exe,IAR+kegen.exe,IAR安装教程.pdf

mahuan1124

IAR EW8051-8.1注册

该IAR EW8051-8.1带注册工具,是我在SCDN上找到的,但是下载需要分,现在免费带给大家,希望大家能够早点用(特注:该地址引用网友百度网盘,希望为大家提供方便,谢谢这位网友啦)

wzc86354120

IAR- EW8051EVweb8101(带注册机)

Windows xp安装:运行IAR kegen PartA810.exe可生成IAR的licence;运行EW8051-EV-Web-8101.exe安装开发软件,根据提示输入licence,并点击下一步直至安装完成。 win7 安装:右键IAR kegen PartA810.exe“以管理员身份运行”;右键EW8051-EV-Web-8101.exe“以管理员身份运行”,之后安装。

夜雨凭栏

NB-IoT+STM32端到端实战开发,带你快速完成NBIOT终端、物联网平台以及应用APP开发

背景介绍 NB-IoT技术的发展已经走过了一年多的时间了,作为华为5G标准的铺垫,NB-IoT正以飞快的速度进入了物联网行业应用中。作为物联网技术中的新秀,其强大的连接能力、广覆盖、超低功耗等特性让其成为物联网技术中的一匹黑马。万物互联的时代,需要更多的公司去参与,如何快速完成产品验证开发是抢占市场的关键,本文将会以免费视频教程及图文形式指导大家快速完成NB-IoT产品开发。 学习平台   ...

IoTCluB
评论 15
收藏 已收藏
分享
返回顶部
yybb526
VC/MFC 16,550 成员 421,606 内容