高分请教:内存泄漏问题

yybb526 2006-07-03 04:43:31
我在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);
}
...全文
428 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yybb526 2006-07-03
  • 打赏
  • 举报
回复
这么多人啊,被分吸引而来啊,我还是早点揭帖好了
yanzi5897 2006-07-03
  • 打赏
  • 举报
回复
这么热闹,我也来。
lisypro 2006-07-03
  • 打赏
  • 举报
回复
up
whwjn 2006-07-03
  • 打赏
  • 举报
回复
估计解决了,接分
xqk 2006-07-03
  • 打赏
  • 举报
回复
估计解决了,接分
coolzdp 2006-07-03
  • 打赏
  • 举报
回复
有情up
tong20037 2006-07-03
  • 打赏
  • 举报
回复
估计解决了,接分
名牌大灰狼 2006-07-03
  • 打赏
  • 举报
回复
You had disremember read-in LocalFree() on the your ARServerCtrlDlg.ccp
牛不得 2006-07-03
  • 打赏
  • 举报
回复
jf,没得发挥下
yefu2000 2006-07-03
  • 打赏
  • 举报
回复
看来都解决了,接分,呵呵
thisisll 2006-07-03
  • 打赏
  • 举报
回复
冲动是魔鬼
接分
yybb526 2006-07-03
  • 打赏
  • 举报
回复
呵呵,不好意思啊,别人给我的代码,我以为很难,还没看就贴上来了,仔细一看,才发现申请的内存没释放,不好意思啊,各位。我太冲动了。
yisong_net 2006-07-03
  • 打赏
  • 举报
回复
看楼主的水平,应该不会犯这样的错误.....
goodboyws 2006-07-03
  • 打赏
  • 举报
回复
m_pQSC没释放?
gaooo 2006-07-03
  • 打赏
  • 举报
回复
The LocalAlloc function allocates the specified number of bytes from the heap. To free the memory, use the LocalFree function.

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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